2012-03-23 16 views
7

Estoy creando un paquete Nuget que tiene dependencias nativas. Los puse dentro del paquete sin problemas al especificar entradas adicionales file en el archivo .nuspec.Nuget Powershell: cómo agregar dependencias nativas? cómo agregar archivos a un proyecto dentro de una carpeta?

Sin embargo, también quiero copiarlos en la carpeta de salida del proyecto que va a usar mi paquete, para que las dependencias puedan encontrarse en tiempo de ejecución.

Mi idea es agregar las dependencias nativas al proyecto y establecer su BuildAction en CopyToOutputDirectory. Esto también lo he logrado con el script de PowerShell a continuación:

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

Function add_file($file) 
{ 
    $do_add = 1 
    foreach($item in $project.DTE.ActiveSolutionProjects[0].ProjectItems) 
    { 
     if ($item -eq $file) 
     { $do_add = 0 } 
    } 
    if ($do_add -eq 1) 
    { 
     $added = $project.DTE.ItemOperations.AddExistingItem($file) 
     $added.Properties.Item("CopyToOutputDirectory").Value = 2 
     $added.Properties.Item("BuildAction").Value = 0   
    } 
} 
add_file(<dependency1>) 
add_file(<dependency2>) 
... 
add_file(<dependencyN>) 

Hasta ahora todo bien.

Pero ahora mi proyecto se contamina completamente con estas dependencias.

¿Hay alguna manera de agregar archivos a un proyecto usando PowerShell y ponerlos dentro de una carpeta?
¿O existe otra forma de lograr lo que quiero: agregar dependencias nativas a un paquete NuGet y enviarlas a la carpeta bin del proyecto usando mi Nu-package?

+0

Actualización: ahora me he alejado de la solución anterior, prefiriendo configurar las dependencias nativas como recursos de enlace de ensamblaje. Esto hace que las dependencias nativas se copien automáticamente. Los recursos de configuración del enlace de ensamblaje no son compatibles de forma nativa para los proyectos de C# en Visual Studio, pero sí para los proyectos de C++/CLI (que utilizo exclusivamente en este contexto). –

+0

Tengo el mismo problema, pero tengo que agregar un archivo de configuración. El título de esta publicación no es relevante para la solución siguiente. Cambie el título -.- '' –

Respuesta

7

El paquete SqlServerCompact hizo algo similar, copiando los dlls relevantes en la carpeta bin en el evento post build. Aquí el código correspondiente:

del archivo: install.ps1

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

. (Join-Path $toolsPath "GetSqlCEPostBuildCmd.ps1") 

# Get the current Post Build Event cmd 
$currentPostBuildCmd = $project.Properties.Item("PostBuildEvent").Value 

# Append our post build command if it's not already there 
if (!$currentPostBuildCmd.Contains($SqlCEPostBuildCmd)) { 
    $project.Properties.Item("PostBuildEvent").Value += $SqlCEPostBuildCmd 
} 

del archivo: GetSqlCEPostBuildCmd.ps1

$solutionDir = [System.IO.Path]::GetDirectoryName($dte.Solution.FullName) + "\" 
$path = $installPath.Replace($solutionDir, "`$(SolutionDir)") 

$NativeAssembliesDir = Join-Path $path "NativeBinaries" 
$x86 = $(Join-Path $NativeAssembliesDir "x86\*.*") 
$x64 = $(Join-Path $NativeAssembliesDir "amd64\*.*") 

$SqlCEPostBuildCmd = " 
if not exist `"`$(TargetDir)x86`" md `"`$(TargetDir)x86`" 
xcopy /s /y `"$x86`" `"`$(TargetDir)x86`" 
if not exist `"`$(TargetDir)amd64`" md `"`$(TargetDir)amd64`" 
xcopy /s /y `"$x64`" `"`$(TargetDir)amd64`"" 
+0

Gracias, lo intentaré después de la w/e. –

Cuestiones relacionadas