我有一个Powershell脚本(由我的NuGet包运行),它将一个post build事件添加到用户的Visual Studio项目中。
$project.Properties | where { $_.Name -eq "PostBuildEvent" } | foreach { $_.Value = "xcopy `"`$(ProjectDir)MyFolder`" `"`$(OutDir)`"" }
不幸的是,它目前覆盖现有的帖子构建事件。 如果我的构建事件尚不存在,如何将Powershell脚本修改为追加?
我之前从未使用过Powershell,但我尝试将其添加到foreach中,但这不起作用:
$_.Value = "$_.Value`nxcopy `"`$(ProjectDir)MyFolder`" `"`$(OutDir)`""
只是给出:
System .__ ComObject.Value xcopy“$(ProjectDir)MyFolder”“$(OutDir)”
答案 0 :(得分:5)
我认为编辑PostBuildEvent属性是错误的方法,可以将后期构建操作添加到用户的项目中。我相信推荐的方法是将自定义操作放入目标,然后导入到项目文件中。自NuGet 2.5开始,如果您包含' build'您的包中的文件夹(与内容和工具处于同一级别)并且它包含{packageid} .targets文件或{packageid} .props文件,NuGet会在您安装软件包时自动将Import添加到项目文件中。
例如,您有一个名为MyNuGet的包。您创建一个包含以下内容的文件build\MyNuGet.targets
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<MySourceFiles Include="$(ProjectDir)MyFolder\**" />
</ItemGroup>
<Target Name="MyNuGetCustomTarget" AfterTargets="Build">
<Copy SourceFiles="@(MySourceFiles)" DestinationFolder="$(OutDir)" />
</Target>
</Project>
这将创建一个自定义目标,该目标配置为在标准Build目标之后运行。它会将一些文件复制到输出目录。
您无需在install.ps1中执行任何其他操作。当用户安装您的软件包时,NuGet会自动将Import导入到用户的proj文件中,并且您的目标将在Build目标运行后运行。
答案 1 :(得分:1)
当引用内部并引用带属性的变量时,您必须将它们括在$()
所以这个:
$_.Value = "$_.Value`nxcopy `"`$(ProjectDir)MyFolder`" `"`$(OutDir)`""
应该是这样的:
$_.Value = "$($_.Value)`nxcopy `"`$(ProjectDir)MyFolder`" `"`$(OutDir)`""
或更简单的方法是使用+=
即:
$_.Value += "`nxcopy `"`$(ProjectDir)MyFolder`" `"`$(OutDir)`""