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

时间:2011-12-12 12:22:53

标签: powershell nuget nuget-package

我正在创建NuGet包,为此我创建了Nuspec清单文件。在content文件夹中,我有两个文件test.exetest.config。现在,当任何用户安装此软件包时,我想将这些文件的“Copy To Output Directory”属性更改为“Copy Always”。

我找到了相关问题NuGet how to apply properties to files,该节目可以使用PowerShell install.ps1脚本执行此操作,但我不知道如何创建该文件。

2 个答案:

答案 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)

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

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

  1. 编写install.ps1脚本以标记文件的状态。
  2. 确保install.ps1脚本位于nuget包中的Tools目录中。
  3. 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目录才能由nu​​get执行脚本。您可以将以下内容添加到nuspec模板中以执行此操作。

    <files>
       <file src="install.ps1" target="Tools"/>
    </files>
    

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