23

我正在创建 NuGet 包,为此我创建了 Nuspec 清单文件。在content文件夹中,我有两个文件,test.exetest.config. 现在,当任何用户安装此软件包时,我想将这些文件的属性“复制到输出目录”更改为项目中的“始终复制”。

我发现了相关问题NuGet how to apply properties to files,表明可以使用 PowerShellinstall.ps1脚本执行此操作,但我不知道如何创建该文件。

4

2 回答 2

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
于 2012-01-17T06:27:26.153 回答
19

以下是有关如何端到端解决此问题的更多详细信息:

您需要做两件事以确保在安装时正确设置状态...

  1. 编写 install.ps1 脚本来标记文件的状态。
  2. 确保 install.ps1 脚本位于 nuget 包的 Tools 目录中。

安装.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 Studios 项目的根目录中有 install.ps1 文件,并标记为“如果较新则复制”。

于 2013-07-24T17:30:18.137 回答