使用AfterTargets的MSBuild任务,在转换后加密web.config

3

我对MSBuild还不熟悉,正在尝试在我的项目中设置一个单独的MSBuildSettings.xml文件,并通过“Post-build事件命令行”选项调用它,以执行3个特定的任务。

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

MSBuildSettings有三个特定的任务。我的前两个任务(如下所示的“YUI”和“LESS”)都完美地工作了。我正在尝试添加的新任务(“Encrypt”)是在转换发生后加密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部分。(我也有自己定义和工作的提供程序。)我发现我正在尝试修改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 中的部分内容,也将不胜感激。

嗯,我刚刚意识到添加 <project>.wpp.targets 文件与指向独立的 MSBuildSettings.xml 文件的 Post-build 事件之间的区别。我认为这可能是导致我混淆的大部分原因。现在我通过将加密步骤添加到 wpp.targets 文件(而我的 js/css 压缩/less 等仍在独立的 MSBuildSettings.xml 文件中)来正确地完成了这些步骤。我想它可以这样工作,但最终我希望它都在同一个地方。希望现在只需要调整这两个文件成为一个文件。仍然希望能得到任何相关主题的建议。 - kman
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 等等,但是这种方法没有成功。第二个 Target 使用 AfterTargets 也有一定道理。
但无论如何,它有效了。现在所有东西都在一个 wpp.targets 文件中,看起来运行得很好。然而,每次对 wpp.targets 文件进行更改时需要卸载/重新加载项目文件,这有点烦人,有点傻。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接