我正在创建一个具有本机依赖关系的Nuget包。通过在file
文件中指定其他.nuspec
条目,我可以毫无问题地将它们放入包中。
但是,我还想将这些文件复制到将要使用我的包的项目的输出文件夹中,以便可以在运行时找到依赖项。
我的想法是将原生依赖项添加到项目中,并将BuildAction
设置为CopyToOutputDirectory
。我还使用下面的PowerShell脚本进行了管理:
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>)
到目前为止一切顺利。
但是,现在我的项目完全被这些依赖项污染了。
有没有办法使用PowerShell将文件添加到项目中并将它们放在文件夹中? 或者是否有其他方法可以实现我想要的:将原生依赖项添加到NuGet包并使用我的Nu-package将它们输出到项目的bin-folder中?
答案 0 :(得分:7)
SqlServerCompact包做了类似的事情,将相关的dll复制到post build事件中的bin文件夹。这里有相关代码:
文件: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
}
文件: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`""
答案 1 :(得分:2)
我建议您使用4.0.8852.1打开SqlServerCompact Nuget包的Nuget Package Explorer版本并将其用作模板。它对我有用。