NuGet:如何使用Install.ps1文件更改文件的属性?

Aru*_*ana 23 powershell nuget nuget-package

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

我发现相关问题NuGet如何将属性应用于文件,显示可以使用PowerShell install.ps1脚本执行此操作,但我不知道如何创建该文件.

小智 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
Run Code Online (Sandbox Code Playgroud)


Jam*_*and 18

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

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

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

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"))
Run Code Online (Sandbox Code Playgroud)

复制到工具

必须将install.ps1文件复制到Tools目录才能由nu​​get执行脚本.您可以将以下内容添加到nuspec模板中以执行此操作.

<files>
   <file src="install.ps1" target="Tools"/>
</files>
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,我在Visual Studio项目的根目录中有install.ps1文件,并标记为"如果更新则复制".