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

时间:2012-06-25 22:25:02

标签: .net msbuild web-config

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

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

MSBuildSettings执行3个特定任务。我的前两个任务(下面的“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 via命令行加密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部分的任何其他或替代选项也将非常感激。

1 个答案:

答案 0 :(得分: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的第二个Target对我来说很有意义。

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