添加post build事件而不覆盖现有事件

时间:2014-08-26 16:18:48

标签: visual-studio powershell nuget post-build-event

我有一个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)”

2 个答案:

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