我正在创建NuGet包,为此我创建了Nuspec清单文件。在content
文件夹中,我有两个文件test.exe
和test.config
。现在,当任何用户安装此软件包时,我想将这些文件的“Copy To Output Directory”属性更改为“Copy Always”。
我找到了相关问题NuGet how to apply properties to files,该节目可以使用PowerShell install.ps1
脚本执行此操作,但我不知道如何创建该文件。
答案 0 :(得分:38)
您的install.ps1文件应如下所示。
param($installPath, $toolsPath, $package, $project)
$file1 = $project.ProjectItems.Item("test.exe")
$file2 = $project.ProjectItems.Item("test.config")
# set 'Copy To Output Directory' to 'Copy if newer'
$copyToOutput1 = $file1.Properties.Item("CopyToOutputDirectory")
$copyToOutput1.Value = 2
$copyToOutput2 = $file2.Properties.Item("CopyToOutputDirectory")
$copyToOutput2.Value = 2
答案 1 :(得分:17)
以下是有关如何端到端解决此问题的更多细节:
您需要做两件事来确保在安装时正确设置状态...
Install.ps1脚本
以下示例脚本将递归地将“Content”和“View”目录中的每个文件标记为“Copy to newer”。请注意,编写此示例脚本是为了使其易于阅读和理解。它将标记Visual Studios项目根目录中Content和Views文件夹中的每个文件。
param($installPath, $toolsPath, $package, $project)
function MarkDirectoryAsCopyToOutputRecursive($item)
{
$item.ProjectItems | ForEach-Object { MarkFileASCopyToOutputDirectory($_) }
}
function MarkFileASCopyToOutputDirectory($item)
{
Try
{
Write-Host Try set $item.Name
$item.Properties.Item("CopyToOutputDirectory").Value = 2
}
Catch
{
Write-Host RecurseOn $item.Name
MarkDirectoryAsCopyToOutputRecursive($item)
}
}
#Now mark everything in the a directory as "Copy to newer"
MarkDirectoryAsCopyToOutputRecursive($project.ProjectItems.Item("Content"))
MarkDirectoryAsCopyToOutputRecursive($project.ProjectItems.Item("Views"))
复制到工具
您必须将install.ps1文件复制到Tools目录才能由nuget执行脚本。您可以将以下内容添加到nuspec模板中以执行此操作。
<files>
<file src="install.ps1" target="Tools"/>
</files>
请注意,在这种情况下,我在Visual Studio项目的根目录中有install.ps1文件,并标记为“如果更新则复制”。