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

ope*_*hac 3 powershell post-build-event visual-studio nuget

我有一个Powershell脚本(由我的NuGet包运行),它将一个post build事件添加到用户的Visual Studio项目中.

$project.Properties | where { $_.Name -eq "PostBuildEvent" } | foreach { $_.Value = "xcopy `"`$(ProjectDir)MyFolder`" `"`$(OutDir)`"" }
Run Code Online (Sandbox Code Playgroud)

不幸的是,它目前覆盖了现有的post build事件.如果尚未存在构建事件,我如何修改Powershell脚本以附加它?

我之前从未使用过Powershell,但我尝试将其添加到foreach中,但这不起作用:

$_.Value = "$_.Value`nxcopy `"`$(ProjectDir)MyFolder`" `"`$(OutDir)`""
Run Code Online (Sandbox Code Playgroud)

只是给出:

System .__ ComObject.Value xcopy"$(ProjectDir)MyFolder""$(OutDir)"

Mik*_*ray 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>
Run Code Online (Sandbox Code Playgroud)

这将创建一个自定义目标,该目标配置为在标准Build目标之后运行.它会将一些文件复制到输出目录.

您无需在install.ps1中执行任何其他操作.当用户安装软件包时,NuGet会自动将Import添加到用户的proj文件中,目标将在Build目标运行后运行.