2012-06-19 5 views
13

Есть ли способ создать пакет NuGet, где, когда пакет установлен в проект, он добавляет ссылки на DLL с «Копировать локальный» на false?Создайте пакет NuGet, который устанавливает ссылки с Copy Local, установленным на false

Я предполагаю, что это будет какой-то скрипт в файле 'install.ps1'.

+0

Просто для любопытства , почему вы не хотите, чтобы файлы были скопированы локально? – kiewic

+1

@ kiewic это отличный вопрос. Вопрос, который я хотел бы, чтобы 5 лет назад я сам был документирован, потому что я понятия не имею! –

ответ

20

Да, вы можете сделать это с помощью install.ps1, как вы уже догадались.

Ниже приведен пример install.ps1, который будет переворачивать флаг на System.dll при каждом его запуске. Вы должны уметь получить представление о том, как сделать то, что вы хотите, используя этот пример:

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; 
     } 
    } 
} 

Но эта документация MSDN должна помочь.

+0

Я нашел сообщение Hanselman о добавлении ссылок в сценарий NuGet Powershell: $ project.Object.References.Add («Microsoft.CSharp») ;. Это приближает меня, но мне трудно найти документацию, показывающую, как выбрать и изменить ссылку для изменения «copy local». –

+0

Обновлен ответ с лучшим примером. –

+0

Когда я делаю это в VS2015 я часто в конечном итоге с дубликатами Правда Ложные

6

Я думаю, что это install.ps1 делает то, что вы просите - все библиотеки DLL, добавляемый пакет предоставляется Локальное значение Копировать значение false. Обратите внимание, что здесь я ничего со списком AssemblyReferences кроме получения всех имен из этого не делать - вы, возможно, придется сделать что-то больше, если вы хотите, условия на основе целевой структуры и т.д.

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

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

foreach ($reference in $project.Object.References) 
{ 
    if ($asms -contains $reference.Name + ".dll") 
    { 
     $reference.CopyLocal = $false; 
    } 
} 
Смежные вопросы