2012-06-19 13 views
13

¿Hay alguna manera de crear un paquete NuGet donde cuando el paquete se instala en un proyecto agrega referencias a dlls con "Copy Local" establecido en false?Crear paquete NuGet que instala referencias con Copy Local establecido en falso

Supongo que sería algún tipo de script dentro del archivo 'install.ps1'.

+0

Sólo por curiosidad ¿Por qué no quieres que los archivos se copien localmente? – kiewic

+1

@kiewic esa es una excelente pregunta. ¡Una pregunta que desearía que mi yo de hace 5 años hubiera documentado porque no tengo idea en este momento! –

Respuesta

20

Sí, puedes hacerlo con install.ps1, como habrás adivinado.

Aquí hay un ejemplo de install.ps1 que cambiará el indicador en System.dll cada vez que lo ejecute. Debería poder hacerse una idea de cómo hacer lo que quiere con este ejemplo:

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

Pero esta documentación de MSDN debería ayudar.

+0

Encontré una publicación de Hanselman sobre 'agregar' referencias en una secuencia de comandos de NuGet Powershell: $ project.Object.References.Add ("Microsoft.CSharp") ;. Eso me acerca, pero tengo problemas para encontrar la documentación que muestra cómo elegir y modificar una referencia para cambiar 'copiar local'. –

+0

Actualicé la respuesta con un mejor ejemplo. –

+0

Cuando hago esto en VS2015 a menudo terminan con duplicados Verdadero Falso

6

Creo que este install.ps1 hace lo que pides - todas las DLL añadidos por el paquete reciben un valor Copy Local de falso. Tenga en cuenta que aquí no estoy haciendo nada con la lista AssemblyReferences excepción de conseguir todos los nombres de ella - puede que tenga que hacer algo más si quieres condiciones sobre la base de marco de destino, etc.

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

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

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