2012-06-19 5 views
13

Có cách nào để tạo gói NuGet khi gói được cài đặt vào một dự án hay không, tham chiếu đến các tệp có "Sao chép cục bộ" được đặt thành false?Tạo gói NuGet cài đặt tham chiếu với Sao chép cục bộ thành false

Tôi cho rằng đó sẽ là một loại tập lệnh trong tệp 'install.ps1'.

+0

Chỉ vì tò mò , tại sao bạn không muốn sao chép các tập tin cục bộ? – kiewic

+1

@kiewic là một câu hỏi tuyệt vời. Một câu hỏi tôi muốn 5 năm trước đây của tôi đã có tài liệu vì tôi không có ý tưởng vào thời điểm này! –

Trả lời

20

Có, bạn có thể thực hiện việc này với install.ps1, như bạn đã đoán.

Dưới đây là ví dụ install.ps1 sẽ lật cờ trên System.dll mỗi lần bạn chạy nó. Bạn sẽ có thể có ý tưởng cách thực hiện những gì bạn muốn bằng ví dụ này:

param($installPath, $toolsPath, $package, $project) 

foreach ($reference in $project.Object.References) 
{ 
    if($reference.Name -eq "System") 
    { 
     if($reference.CopyLocal -eq $true) 
     { 
      $reference.CopyLocal = $false; 
     } 
     else 
     { 
      $reference.CopyLocal = $true; 
     } 
    } 
} 

Nhưng tài liệu MSDN này sẽ hữu ích.

+0

Tôi tìm thấy một bài viết của Hanselman về các tham chiếu 'thêm' trong kịch bản NuGet Powershell: $ project.Object.References.Add ("Microsoft.CSharp") ;. Điều đó khiến tôi gần gũi hơn nhưng tôi gặp khó khăn khi tìm tài liệu hướng dẫn cách chọn và sửa đổi tham chiếu để thay đổi 'sao chép địa phương' –

+0

Cập nhật câu trả lời bằng ví dụ tốt hơn. –

+0

Khi tôi làm điều này trong VS2015 Tôi thường kết thúc với bản sao Đúng False

6

Tôi nghĩ install.ps1 này làm những gì bạn yêu cầu - tất cả các file DLL bổ sung bởi các gói được đưa ra một bản sao giá trị địa phương của sai. Lưu ý rằng ở đây tôi không làm bất kỳ điều gì với danh sách AssemblyReferences ngoài việc nhận tất cả tên từ nó - bạn có thể phải làm điều gì đó khác nếu bạn muốn điều kiện dựa trên khung mục tiêu, v.v.

param($installPath, $toolsPath, $package, $project) 

$asms = $package.AssemblyReferences | %{$_.Name} 

foreach ($reference in $project.Object.References) 
{ 
    if ($asms -contains $reference.Name + ".dll") 
    { 
     $reference.CopyLocal = $false; 
    } 
}