2009-03-02 12 views
46

Tôi tự hỏi liệu có bất kỳ phỏng đoán nào khi đặt copy-local=true để tham khảo không?Khi nào nên sao chép địa phương được đặt thành true và khi nào thì không?

Nếu loại tham chiếu chỉ được sử dụng trong nội bộ có thể tôi đặt copy-local để true nhưng nếu loại tham chiếu được tiếp xúc như các tham số hoặc giá trị trả lại tôi đặt copy-local-false và chỉ ra rằng một phiên bản cụ thể của sự phụ thuộc nên được tham chiếu khi thư viện của tôi nên đã sử dụng?

Có ai có thể làm rõ điều này cho tôi không?

Trả lời

2

Tùy chọn này chỉ ảnh hưởng đến giai đoạn xây dựng. Nó chỉ sao chép tham chiếu đến thư mục cục bộ của assembly được xây dựng. Nếu một assembly khác (T) muốn sử dụng một phương thức từ assembly bạn đang xây dựng (A) có kiểu trả về hoặc tham số từ một assembly khác (R), nó (T) sẽ có thể truy cập assembly đó (R). Nó có thể có thể làm như vậy mà không làm bất cứ điều gì đặc biệt nếu lắp ráp tham chiếu (R) được cài đặt trong GAC. Nếu không, nó cần một bản sao cục bộ của điều đó.

+3

Nó hơi hơn một chút. Nó ảnh hưởng lớn đến các kịch bản triển khai. – JaredPar

+0

Tôi tin rằng nó không ảnh hưởng đến việc xây dựng ngoại trừ chỉ là một quá trình sao chép tập tin đơn giản. Vui lòng sửa tôi nếu nó không đúng. –

+0

@Mehrad, nó sẽ ảnh hưởng đến các kịch bản xây dựng nhưng nó cũng ít nhất là nhằm mục đích triển khai. – JaredPar

41

Sao chép địa phương là quan trọng đối với các kịch bản và công cụ triển khai. Theo nguyên tắc chung, bạn nên sử dụng CopyLocal = True nếu tham chiếu không được chứa trong GAC.

Sao chép cục bộ về cơ bản có nghĩa là tôi phải triển khai thủ công tệp DLL này để ứng dụng của tôi hoạt động. Khi nó sai về cơ bản nó có nghĩa là "Tôi phụ thuộc vào một thành phần khác mà phải được cài đặt riêng biệt hoặc chuỗi, DLL sẽ chỉ có ở đó đã".

+1

Làm thế nào về trong trường hợp tôi có một thư viện tiện ích MyUtils sử dụng LibX (không phải trong gac) nội bộ và không lộ bất kỳ loại hình cụ thể LibX nào. Ở đó tôi sẽ đặt copy-local thành true. Tuy nhiên, nếu tôi để lộ các loại LibX từ MyUtils, tôi sẽ phải ref. LibX cũng như ProjectA sử dụng MyUtils không? – Fadeproof

+0

Tôi có nên trong trường hợp đó đặt bản sao địa phương để sai như tôi sẽ phải ref LibX cũng như MyUtils từ ProjectA? – Fadeproof

10

Thực sự là về môi trường mục tiêu. Nếu bản sao cục bộ là sai, bạn đang nói rằng assembly sẽ tồn tại trong môi trường đích (thông thường trong GAC). Đặt nó thành true đảm bảo nó sẽ xuất hiện trong đầu ra của bản dựng của bạn, do đó làm cho nó dễ triển khai hơn tới môi trường đích.

6

Kiểm tra tài liệu tham khảo MSDN sau đây giải thích chi tiết hành vi của CopyLocal.

Project References

Đáng tiếc là có một số tật và CopyLocal sẽ làm việc không cần thiết như mong đợi để tham khảo lắp ráp trong hội đồng học có cấu trúc như hình dưới đây.

  • MainApp.exe
    • MyLibrary.dll
      • ThirdPartyLibrary.dll (nếu trong GAC CopyLocal sẽ không sao chép vào thư mục bin MainApp)

Điều này làm cho việc triển khai xcopy trở nên khó khăn nếu bạn không pl một cài đặt lắp ráp bên thứ ba vào GAC trên máy mục tiêu.

11

Sao chép cục bộ được triển khai thực sự để hỗ trợ gỡ lỗi cục bộ. Khi bạn perpare ứng dụng của bạn cho gói và triển khai, bạn nên xây dựng các dự án của bạn vào cùng một thư mục đầu ra và chắc chắn rằng bạn có tất cả các tài liệu tham khảo bạn cần ở đó.

CopyLocal đặc biệt là một nỗi đau khi xây dựng các cây nguồn lớn.Có một câu hỏi liên quan về cách vô hiệu hoá CopyLocal tại đây trên SO, bạn có thể xem nó tại How do I override CopyLocal (Private) setting for references in .NET from MSBUILD. Cũng như Best practices for large solutions in Visual Studio (2008).

Tôi đã viết về cách xử lý việc xây dựng các cây nguồn lớn trong bài viết MSBuild: Best Practices For Creating Reliable Builds, Part 2.

Vì vậy, trong ngắn hạn tôi sẽ nói vô hiệu hóa CopyLocal khi sao chép tệp đang làm cho các bản dựng của bạn mất nhiều thời gian hơn thì bạn sẵn sàng chi tiêu cho mỗi bản dựng.

+3

Sẽ tốt hơn nếu nói "vô hiệu hóa CopyLocal ONLY khi bạn thay đổi đầu ra để xây dựng các dự án của bạn vào cùng một thư mục đầu ra và chắc chắn rằng bạn có tất cả các tham chiếu bạn cần ở đó." –

+0

@MichaelFreidgeim: Bạn có tìm thấy câu trả lời cho câu hỏi của mình không? – davenewza

0

Cách bảo thủ để đặt CopyLocal false là kiểm tra xem tham chiếu có được tìm thấy trong đường dẫn đầu ra của dự án hay không. Điều này sẽ cho phép bạn né tránh một số vấn đề thời gian chạy khó chịu, trong khi vẫn giảm số lượng IO.

Trong quá trình tôi đã tạo CopyLocalFixer, bạn có thể chạy cho một thư mục. Tôi đã thử điều này với một bản dựng lớn, nhưng kết quả không thật ấn tượng. Tôi đoán nó đi xuống đến cấu trúc thư mục của dự án.