3

我是 MSBuild 的新手,我试图在我的项目中设置一个 MSBuildSettings.xml 文件,通过项目首选项中的“构建后事件命令行”选项调用,它执行 3 个特定任务。

$(MSBuildBinPath)\msbuild.exe "$(ProjectDir)MSBuild\MSBuildSettings.xml"

MSBuildSettings 执行 3 个特定任务。我的前 2 个任务(下面的“YUI”和“LESS”)运行良好。我要添加的新任务(“加密”)是在转换发生后加密 web.config。

我正在使用一个结构如下的 xml 文件:

<Project DefaultTargets="YUI;LESS;Encrypt;">
    ...
    <Target Name="YUI">...</Target>

    <Target Name="LESS" DependsOnTargets="YUI">...</Target>

    <Target Name="Encrypt" AfterTargets="CopyAllFilesToSingleFolderForPackage">
        <Exec Command="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -pef &quot;connectionStrings&quot; $(MSBuildProjectDirectory)\..\obj\Release\Package\PackageTmp -prov &quot;MyProtectedDataProvider&quot;" />
    </Target>
</Project

我基本上试图通过命令行使用 aspnet_regiis 加密 connectionStrings 部分。(我也定义了自己的 Provider 并在工作。)我确实觉得有点奇怪,我正在尝试修改 PackageTmp 文件夹中的 web.config,但据我所知,这是转换后的 web 之前的最终位置.config 已部署(我显然不想更新项目中的原始 web.config 文件)。我不认为命令/执行有什么问题,因为它是它的时机。我根本不知道如何使第三步仅在发生转换后执行。

我已启用构建输出的详细信息视图选项,并通过 Microsoft.Web.Publishing.targets 文件尝试提出一个目标,我可以使用该目标仅在转换后调用我的 web.config 加密步骤已经发生,但无论我尝试什么 AfterTargets,我似乎总是得到:

The target "whatever" does not exist in the project.

我试过 PipelinePreDeployCopyAllFilesToOneFolder、TransformWebConfig、PipelineTransformPhase、CopyAllFilesToSingleFolderForPackage 等。

附加说明:我了解 web.config 仅在发布时进行转换(并且我正在使用文件系统选项进行发布)。

这也是普通的 MSBuild(没有 TFS 团队构建或类似的东西)。

对于加密 web.config 部分的转换后步骤的任何附加或替代选项也将不胜感激。

4

1 回答 1

0

我最终只使用了具有以下结构的 *.wpp.targets 文件:

<Project xmlns="http://schemas.microsoft.com/developer/MsBuild/2003">
    <Target Name="AfterBuild">
        ... My YUI steps and my LESS steps ...
    </Target>
    <Target Name="Encrypt" AfterTargets="CopyAllFilesToSingleFolderForPackage">
        ... My web.config encrypt steps ...
    </Target>
</Project>

老实说,我并不完全理解第一步(AfterBuild)命名背后的原因,它只是自动知道何时运行。我真的宁愿拥有自己的名字和明确的 AfterTargets 或 BeforeTargets 之类的东西,但我对这种方法没有任何运气。带有 AfterTargets 的第二个目标对我来说很有意义。

但无论如何,它有效。现在一切都在一个 wpp.targets 文件中,并且似乎工作得很好。每次对 wpp.targets 文件进行更改时都必须卸载/重新加载项目文件,这有点痛苦——这太傻了。

于 2012-06-28T04:43:14.513 回答