【问题标题】:Add post build event without overwriting existing events添加构建后事件而不覆盖现有事件
【发布时间】:2014-10-20 01:26:26
【问题描述】:

我有一个 Powershell 脚本(由我的 NuGet 包运行),它向用户的 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)"

【问题讨论】:

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


    【解决方案1】:

    在引号内,并使用属性引用变量时,您必须将它们括在$()

    所以这个:

    $_.Value = "$_.Value`nxcopy `"`$(ProjectDir)MyFolder`" `"`$(OutDir)`""
    

    应该是这样的:

    $_.Value = "$($_.Value)`nxcopy `"`$(ProjectDir)MyFolder`" `"`$(OutDir)`""
    

    或者更简单的方法是使用+=

    即:

    $_.Value += "`nxcopy `"`$(ProjectDir)MyFolder`" `"`$(OutDir)`""
    

    【讨论】:

    • 感谢@HAL9256,它现在正在附加,但是新行 `n 似乎不起作用。有什么明显的我做错了吗?
    • 好的,意识到我需要改用rn。只需要弄清楚如何检查构建事件现在是否已经存在。
    • 要检查它是否已经存在,请发送if($_.Value -notmatch "My Code"){--Code to Add Event--}
    【解决方案2】:

    我认为编辑 PostBuildEvent 属性是向用户项目添加后期构建操作的错误方法。我相信推荐的方法是将您的自定义操作放入目标中,然后将其导入项目文件中。从NuGet 2.5 开始,如果您在包中包含一个“构建”文件夹(与内容和工具处于同一级别)并且它包含一个 {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>
    

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

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

    【讨论】:

    • mike z 完全正确。这将是做到这一点的“正确”方式。
    • @mike-z 这太棒了。我没有意识到你可以用 NuGet 做到这一点,它第一次工作。谢谢
    • @openshac 是的,直到我做了一些研究,我才知道这一点。更好的是,nuget 将在卸载时自动删除导入。在编辑构建后事件脚本时,这真的很棘手。
    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2021-05-06
    相关资源
    最近更新 更多