Làm thế nào để bạn chia sẻ tập lệnh giữa nhiều dự án trong một giải pháp?


76

Trong trường hợp câu hỏi không rõ ràng. Tôi có 3 dự án MVC trong một Giải pháp. Mỗi khi tôi tạo một dự án mới, nó sẽ thêm thư mục "Scripts" với tất cả các tệp .js mà tôi cần. Tôi không muốn tạo điều này mọi lúc cho mọi ứng dụng. Có cách nào để tham chiếu các tập lệnh từ một thư mục trung tâm trong giải pháp để tất cả các ứng dụng / dự án có thể chia sẻ một thư mục tập lệnh chung với tất cả các tập lệnh chung trong số đó không?

Chỉnh sửa: Vui lòng giải thích ưu và nhược điểm của việc này nếu có bất kỳ ... bây giờ tôi tò mò.


Điều này không hoạt động đối với các thư mục, nhưng bạn có thể liên kết một tệp từ một dự án khác. Nhấp chuột phải vào thư mục và Thêm Mục hiện có, tìm tệp của bạn trong một dự án khác, nhấp vào mũi tên bên cạnh nút Thêm và chọn "Thêm dưới dạng liên kết". Tệp sẽ không tồn tại thực tế ở vị trí chính xác cho đến khi bạn triển khai, vì vậy điều này sẽ không hoạt động đối với các tệp tập lệnh tĩnh trong khi gỡ lỗi trong Visual Studio.
Nick VanderPyle

Câu trả lời:


118

Đây là những gì tôi muốn giới thiệu:

Nhấp chuột phải vào giải pháp và tạo Thư mục Giải pháp Mới có tên Common Javascript Files(hoặc bất kỳ thứ gì bạn muốn gọi nó.

Thư mục giải pháp mới

Thư mục giải pháp tệp Javascript phổ biến

Nhấp chuột phải vào Giải pháp, nhấp vào Mở thư mục trong Windows Explorer hoặc điều hướng đến đó theo cách thủ công cho các phiên bản Visual Studio khác :(

Mở thư mục trong Windows Explorer

Trong thư mục giải pháp, hãy tạo một thư mục có cùng tên với thư mục giải pháp (các thư mục giải pháp thường không khớp với các thư mục ở cấp mã nguồn nhưng điều này sẽ vì lợi ích của sự tỉnh táo).

Thư mục tệp Javascript phổ biến

Trong thư mục mới này, hãy thêm các tệp cần được chia sẻ giữa các giải pháp.

Thêm tệp Javascript vào thư mục

Trong Visual Studio, bấm vào thư mục giải pháp và chọn Thêm - Mục hiện có .

Visual Studio Add - Itme hiện có

Trong hộp thoại chọn tệp, điều hướng đến thư mục đã tạo trước đó, chọn (các) tệp được thêm vào thư mục và nhấp vào Thêm .

Chọn tệp để thêm

Tệp thư mục giải pháp

Trong mỗi Dự án cần tệp chia sẻ, nhấp chuột phải vào dự án (hoặc thư mục bên trong dự án) và nhấp vào Thêm - Mục hiện có .

Dự án Thêm mục hiện có

Điều hướng đến Thư mục được chia sẻ, Chọn tệp và nhấp vào mũi tên thả xuống, sau đó nhấp vào Thêm dưới dạng liên kết .

Thêm dưới dạng liên kết

Bây giờ các tệp trong các dự án về cơ bản là các đoạn ngắn cho các tệp trong Thư mục Giải pháp. Nhưng chúng được coi là tệp thực tế trong dự án (bao gồm tệp .CS hoặc Visual Basic, chúng sẽ được biên dịch dưới dạng tệp thực sự tồn tại trong dự án).

Tệp liên kết

PROS

  • Các tệp thực sự được chia sẻ trên các dự án tại thời điểm Thiết kế
  • Chỉ có thể thêm các tệp cần thiết cho mỗi dự án, không phải tất cả hoặc không có gì
  • Không yêu cầu bất kỳ cấu hình nào trong IIS (thư mục ảo, v.v.)
  • Nếu giải pháp nằm trong kiểm soát Nguồn TFS, bạn có thể thêm Thư mục vào Nguồn TFS và các tệp được chia sẻ sẽ được kiểm soát nguồn.
  • Chỉnh sửa tệp bằng cách chọn nó trong Dự án, sẽ chỉnh sửa tệp thực tế.
  • Xóa tệp được liên kết không xóa tệp.
  • Điều này không giới hạn ở các tệp JS, các tệp được liên kết có thể là BẤT KỲ tệp nào bạn có thể cần (Hình ảnh, Css, Xml, CS, CSHTML, v.v.)

CONS

  • Mỗi triển khai nhận được tệp riêng của nó.
  • Có một đường cong học tập nhỏ khi hiểu rằng Thư mục Giải pháp không phải là Thư mục tồn tại trong Thư mục Giải pháp.

38
Cũng hữu ích khi lưu ý rằng các tệp được liên kết sẽ không thể truy cập được trong quá trình gỡ lỗi, trừ khi một tác vụ được thêm vào Tệp Dự án để sao chép thủ công các tệp được liên kết như được mô tả ở đây .
Mac

1
Khi tôi xuất bản dự án, các tệp không được sao chép vào cấu trúc thư mục mà tôi đã tạo. Bất kỳ ý tưởng làm thế nào để giải quyết điều này?
Fonsini,

2
@Fonsini Đặt thuộc tính của các tệp được liên kết một cách chính xác.
Erik Philips,

1
Vấn đề tôi đang gặp phải là khi cố gắng đưa các tệp JS vào HTML, nó muốn giải quyết vào thư mục thực - không phải thư mục được liên kết. Điều đó không thực tế chút nào.
MarzSocks

1
Bạn có thể muốn biết rằng câu trả lời này đang được thảo luận (gián tiếp) ở đây trên meta .
Ilmari Karonen

24

Điều tốt nhất nên làm, imo, là cuộn CDN của riêng bạn ... Về cơ bản, chỉ cần tạo một trang web khác trong IIS và cung cấp cho nó ràng buộc riêng, ví dụ: "http://cdn.somedomain.com"

Sau đó, lưu trữ tất cả css / js / font / hình ảnh chia sẻ của bạn, v.v. trên trang CDN và liên kết đến chúng từ các trang khác của bạn.

Làm như vậy giải quyết được 2 vấn đề,

  1. Tất cả nội dung của bạn được chia sẻ khi cần thiết và bạn chỉ phải quản lý 1 bản sửa đổi cho mỗi tệp.
  2. Trình duyệt của người dùng của bạn có thể lưu chúng vào bộ nhớ cache ở 1 vị trí duy nhất thay vì tải xuống các bản sao nội dung của bạn cho mọi trang web sử dụng chúng ..

Tôi đã thêm câu trả lời này bởi vì tôi thấy nhiều người đang giới thiệu việc tạo thư mục ảo. Mặc dù điều đó thực sự chia sẻ các tệp, nhưng nó tạo ra nhiều đường dẫn tải xuống cho chúng, gây lãng phí băng thông cực kỳ lớn. Tại sao lại bắt người dùng của bạn tải xuống jquery.js (1 * số lượng trang web) khi bạn có thể cho phép họ tải xuống một lần trên (cdn.somedomain.com).

Ngoài ra, khi tôi nói lãng phí băng thông, tôi không chỉ nói về băng thông máy chủ, tôi đang nói về người dùng di động trên các gói dữ liệu ... Ví dụ, tôi truy cập trang web nhân sự của công ty chúng tôi (insuance, v.v.) trên điện thoại của tôi. ngày và nó tiêu thụ 25mb ngay khi ra khỏi cổng, tải xuống jquery và một loạt nội dung 5 lần mỗi lần ... Với gói dữ liệu 2gb một tháng, các trang web làm điều đó thực sự làm tôi khó chịu.


Tôi nghĩ rằng tôi sẽ thêm nó để liên kết với họ, hãy sử dụng cú pháp //cdn.somedomain.com nếu bạn đã định cấu hình cả http / https, nó sẽ mặc định thành bất cứ điều gì bao gồm cả. Ngoài ra, nếu bạn có CDN nhà phát triển và cdn Sản xuất, bạn có thể lưu trữ url cdn trong appSettings, ví dụ: ProdCdnUrl và DevCdnUrl, sau đó sử dụng biên dịch có điều kiện để chọn một cho cấu hình xây dựng của dự án, ví dụ: #if DEV getdevurl #if PROD getprodurl .. . Sau đó, sử dụng nó trong dao cạo mẫu của bạn một cái gì đó giống như kịch bản src = "@ (cdnUrl) / lib / bootstrap ..."
Ryan Mann

1
Theo dõi thêm về điều này, tôi thực sự đã bỏ sử dụng Script và Gói kiểu hoàn toàn bằng phương pháp này. Thay vào đó, tôi sử dụng Node.js, Gulp, Css-Minify, Uglify, gulp-sass, v.v. Vì vậy, tôi chỉ làm "Gulp compile-css" và "gulp compile-js" và "gulp watch-css" và "gulp watch- js "trong nút để xử lý chuyển đoạn Javascript Sass và ES6 của tôi thành javascript css và es5. Ngoài ra, tôi có tệp node project.json trong thư mục gốc của ứng dụng web .Net mvc của mình và sử dụng công cụ vs node cho cửa sổ nút tương tác để làm việc với nút từ VS, cũng như phần mở rộng Dòng lệnh tại đây cho VS.
Ryan Mann

Cảm ơn bạn vì thông tin chi tiết mới được đưa ra trong nhận xét vào tháng 2 năm 2016 của bạn.
Theophilus

Tôi lại thay đổi. Tôi sử dụng Gulp4 với Babel và Rollup Js bây giờ và đã cấu hình cuộn lên để biên dịch sang IIFE. Và tôi biên dịch tài sản thành các gói nuget. Trên CDN của chúng tôi, chúng tôi có thiết lập .Net Project cơ bản thông qua lõi dotnet, nơi chúng tôi có thể thêm các gói và gói cập nhật và sử dụng khôi phục dotnet. Vì vậy, nếu chúng ta muốn thêm một cái gì đó vào cdn, chúng ta thực hiện nó trong một gói nuget và thiết lập nó để chuyển tải trên bản dựng và "dotnet pack" sẽ tạo một gói ra khỏi thư mục "dst" và khi được cài đặt, nó sẽ thêm dst thư mục đến dự án mục tiêu với hệ thống thứ cấp mà chúng tôi muốn. Vì vậy, chúng tôi có thể kiểm soát cdn với dotnet cli.
Ryan Mann

Ngoài ra, nếu chúng tôi cập nhật một gói, chúng tôi chỉ có thể chạy một tập lệnh cập nhật dotnet và thiết lập nó trong quản lý phát hành / tự động hóa devops.
Ryan Mann

11

Đây là giải pháp tốt nhất và dễ dàng nhất, IMO là giải pháp tốt nhất và dễ dàng nhất, tôi đã dành một tuần để cố gắng tìm ra cách tốt nhất và dễ nhất mà luôn có nhiều nhược điểm hơn là ưu điểm:

Resources(DLL)
  Shared
    images
      image.png
    css
      shared.css
    scripts
      jquery.js


MvcApp1
  Images
  Content
  Shared <- We want to get files from above dll here
  ...

MvcApp2
  Images
  Content
  Shared <- We want to get files from above dll here
  ...

Thêm sau vào MvcApp1 -> Dự án -> Thuộc tính MvcApp1 -> Tạo sự kiện -> đăng sự kiện xây dựng:

start xcopy "$(SolutionDir)Resources\Shared\*" "$(SolutionDir)MvcApp1\Shared" /r /s /i /y

Đây là giải thích về những gì nó làm: Bao gồm Xây dựng thư mục tệp nội dung hành động từ hội đồng tham chiếu ở cùng cấp với thư mục bin

Làm tương tự cho MvcApp2. Giờ đây, sau mỗi lần xây dựng, các tệp tĩnh mới sẽ được sao chép vào ứng dụng của bạn và bạn có thể truy cập các tệp như "~ / Shared / css / site.css"

Nếu bạn muốn, bạn có thể điều chỉnh lệnh trên để sao chép tập lệnh từ .dll sang thư mục script của mọi ứng dụng, bằng cách đó bạn có thể di chuyển một số tập lệnh sang .dll mà không phải thay đổi bất kỳ đường dẫn nào, đây là ví dụ:

Nếu bạn chỉ muốn sao chép các script từ Resources / Shared / scripts vào MvcApp1 / scripts sau mỗi lần tạo:

start xcopy "$(SolutionDir)Resources\Shared\Scripts\*" "$(SolutionDir)MvcApp1\Scripts" /r /s /i /y

3 câu hỏi: 1) Điều gì xảy ra nếu một tệp bị xóa khỏi Tài nguyên / Được chia sẻ - có vẻ như nó sẽ không bị xóa khỏi bản sao MvcApp của thư mục? 2) Có cách nào để Visual Studio xóa các tệp này $(SolutionDir)sau khi quá trình chạy hoàn tất. Để chúng ở đó có thể gây nhầm lẫn cho các nhà phát triển khác. 3) Bạn có (DLL) trong dấu ngoặc sau thư mục Tài nguyên. Bất kỳ cách cụ thể để thiết lập điều này?
Adam

1) Tất nhiên chúng sẽ ở trong thư mục, vì chúng tôi chỉ sao chép chúng 2) Giải pháp là xóa tất cả các tệp trong thư mục trước khi sao chép, bạn sẽ thêm một cái gì đó như thế này trước xcopy: stackoverflow.com/questions/768282/… , hoặc viết một kịch bản hàng loạt tập tin rằng séc hai thư mục và xóa sự khác biệt và gọi nó là sử dụng như: stackoverflow.com/questions/12764847/... 3) đó là cuộc biểu tình mà thôi, một dự án dll của nó được gọi là Tài
formatc

@Adam xem bình luận ở trên.
formatc

Bất cứ khi nào bạn chỉnh sửa tài nguyên được chia sẻ, bạn cần phải xây dựng dự án để xem các thay đổi, phải không?
nghiền nát

@crush Có, nhưng bạn có thể tạo tập lệnh hàng loạt và đặt các lệnh đó vào đó, sau đó thay thế sự kiện xây dựng bài đăng để bắt đầu tập lệnh của bạn và bạn có thể khởi động nó theo cách thủ công, có thể có "macro" hoặc thứ gì đó trong VS sẽ cho phép tập lệnh chạy của bạn về thay đổi tệp.
formatc

6

Đây là một câu trả lời muộn nhưng Microsoft đã thêm một loại dự án được gọi là Shared Projectbắt đầu Visual Studio 2013 Update 2có thể làm chính xác những gì bạn không muốn mà không cần phải linktập tin.

Tham chiếu dự án được chia sẻ hiển thị dưới nút Tham chiếu trong Trình khám phá giải pháp, nhưng mã và nội dung trong dự án được chia sẻ được xử lý như thể chúng là các tệp được liên kết với dự án chính.

"Trong các phiên bản trước của Visual Studio, bạn có thể chia sẻ mã nguồn giữa các dự án bằng cách Thêm -> Mục Hiện có và sau đó chọn Liên kết. Nhưng điều này khá rắc rối và mỗi tệp nguồn riêng biệt phải được chọn riêng lẻ. Với việc chuyển sang hỗ trợ nhiều các nền tảng khác nhau (iOS, Android, v.v.), họ quyết định giúp việc chia sẻ nguồn giữa các dự án trở nên dễ dàng hơn bằng cách thêm khái niệm Dự án được chia sẻ. "

https://blogs.msdn.microsoft.com/somasegar/2014/04/02/visual-studio-2013-update-2-rc-windows-phone-8-1-tools-shared-projects-and-universal- windows-apps /

Thông tin từ chủ đề này:

Sự khác biệt giữa Dự án được chia sẻ và Thư viện Lớp trong Visual Studio 2015 là gì?

https://stackoverflow.com/a/30638495/3850405


Điều này nghe có vẻ tuyệt vời trên giấy, nhưng tôi vẫn chưa thấy một ví dụ nào về các Dự án được chia sẻ được sử dụng thành công với các tệp JavaScript. Chắc chắn bạn có thể tạo dự án được chia sẻ và đặt các tập lệnh của mình ở đó, nhưng dự án web dường như không nhận ra chúng đúng cách.
Nathanael

3

Một gợi ý sẽ cho phép bạn gỡ lỗi các tập lệnh của mình mà không cần biên dịch lại dự án:

  • Chọn một dự án " chính " (bạn sẽ sử dụng để gỡ lỗi) và thêm tệp vật lý vào đó
  • Sử dụng tính năng "Thêm dưới dạng liên kết" như được mô tả trong câu trả lời của Eric để thêm tệp tập lệnh vào các dự án khác trong giải pháp
  • Sử dụng tác vụ CopyLinkedContentFiles trên Build, như được đề xuất trong nhận xét của Mac để sao chép các tệp qua tệp thứ hai vào các dự án bổ sung của bạn

Bằng cách này, bạn có thể sửa đổi các tập lệnh trong dự án " chính " mà không cần khởi động lại trình gỡ lỗi, điều này đối với tôi tạo nên sự khác biệt.


Bạn có thể giải thích cách có thể sửa đổi các tệp dự án "chính" và thực hiện các thay đổi trong khi ứng dụng đang chạy mà không cần khởi động lại trình gỡ lỗi không? Các tệp được liên kết chỉ được sao chép trên bản dựng và bạn không thể tạo mà không dừng trình gỡ lỗi ngay từ đầu.
pbalaga

Nếu bạn thêm tệp vật lý vào "cái" (không chỉ các liên kết), bạn có thể sửa đổi cái mà không cần khởi động lại. Trong các dự án khác, các tệp được liên kết sẽ được sao chép trên bản dựng, nhưng điều đó ít tác động hơn, vì tôi đã dành phần lớn thời gian của mình để chạy tệp chính.
DivineOps

Điều này nên được đánh dấu là câu trả lời vì nó ít phức tạp hơn! Sửa đổi đối với .csproj là cái này: <! - Sao chép các tệp nội dung được liên kết vào vị trí của chúng trên bản dựng. -> <Target Name = "CopyLinkedContentFiles" BeforeTargets = "Build"> <Copy SourceFiles = "% (Content.Identity)" DestinationFiles = "% (Content.Link)" SkipUnchangedFiles = "true" OverwriteReadOnlyFiles = "true" Condition = "'% (Content.Link)'! = ''" /> </Target>
barbara.post

2

Trong IIS, tạo một thư mục ảo trỏ đến cùng một thư mục script cho mỗi ứng dụng trong số 3 ứng dụng. Sau đó, bạn sẽ chỉ cần giữ chúng trong một ứng dụng duy nhất. Có những lựa chọn thay thế khác, nhưng nó thực sự phụ thuộc vào cách các ứng dụng của bạn được cấu trúc.

Biên tập

Một ý tưởng đáng sợ hơn là sử dụng Khu vực. Trong một khu vực chung, có một thư mục script với các script được thiết lập để biên dịch. Sau đó, tự phục vụ chúng bằng cách lấy chúng ra khỏi dll. Đây có thể là một ý tưởng hay nếu bạn thấy Khu vực chung có nhiều chức năng hơn sau này.


Đó là một ý tưởng tuyệt vời khi dự án ở trên máy chủ. Còn khi dự án vẫn còn trên hộp phát triển trong Visual Studio thì sao?
Nick VanderPyle

@NickVanderPyle cùng một ý tưởng sẽ hoạt động. Có thể thiết lập nó, bất kể bạn đang sử dụng bộ điều hợp lặp lại và các trang web khác nhau hay chỉ các ứng dụng khác nhau.
Yuriy Faktorovich

Ồ, tôi hiểu rồi. Nó sẽ hoạt động nếu bạn đang chạy và gỡ lỗi với IIS cục bộ và có thể sử dụng các thư mục ảo. Tốt cuộc gọi.
Nick VanderPyle

Bạn nghĩ gì về điểm nối NTFS nếu IIS không có sẵn?
Nick VanderPyle

@NickVanderPyle, bạn sẽ phải xóa các thư mục script khỏi 2 trong số các dự án, nhưng vâng, điều đó nghe cũng khá hay.
Yuriy Faktorovich

1

Hầu hết các tệp được bao gồm theo mặc định cũng có sẵn thông qua các CDN khác nhau.

Nếu bạn không thêm các tập lệnh tùy chỉnh của riêng mình, bạn thậm chí có thể không cần một thư mục tập lệnh.

CDN của Microsoft dành cho tập lệnh: http://www.asp.net/ajaxlibrary/cdn.ashx

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.