2011-12-12 96 views
22

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

我发现相关的问题NuGet how to apply properties to files,显示可以使用PowerShell install.ps1脚本来做到这一点,但我不知道如何创建该文件。

回答

37

您的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

//不是在powershell中的评论,使用#:)否则非常有用,谢谢 – grahamrhay

+1

@brent:寻找一些文档接受的项目(“CopyToOutputDirectory”)我知道这是一个DTE枚举,但似乎不能找到它: - /你的参考链接对我和任何找到答案的人都会有很大的帮助。 – workabyte

15

这里是如何解决这个问题的端到端的更详细一点:

你需要做两件事情,以确保正确设置上安装状态...

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

Install.ps1脚本

下面的示例脚本将递归标志着“内容”的所有文件和“查看”目录“复制到新的”。注意这个示例脚本是为了清楚阅读和理解而编写的。它将标记Visual Studio项目根目录下的“内容”和“视图”文件夹中的每个文件。

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> 

注意我在我的视觉工作室项目的根目录的文件install.ps1并标记为“复制,如果新”。

+0

以上是给 异常调用“Item”带有“1”参数:“该参数不正确(异常来自HRESULT:0x80070057(E_INVALIDARG))” At Tools \ install.ps1:3 char: 27 + $ project.ProjectItems.Item <<<<(“Content”)。ProjectItems.Item(“file.jar”)。Properties.Item(“CopyToOutputDirectory”)。Value = 1 + CategoryInfo:NotSpecified:(: )[],MethodInvocationException + FullyQualifiedErrorId:ComMethodTargetInvocation ' 我通过改变 'MarkDirectoryAsCopyToOutputRecursive($ project.ProjectItems固定这一点。项目(“Content”))' 到 'MarkDirectoryAsCopyToOutputRecursive($ project))' – Paul

+1

@Paul您的建议将**项目中的所有**设置为CopyIfNewer,这可能不是您想要的。你可以使用'$ project.ProjectItems.Item(“”)'来设置仅用于项目文件夹中文件的属性。答案并不完全清楚。 –

相关问题