我是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 "connectionStrings" $(MSBuildProjectDirectory)\..\obj\Release\Package\PackageTmp -prov "MyProtectedDataProvider"" />
</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部分的任何其他或替代选项也将非常感激。
答案 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文件时,都必须卸载/重新加载项目文件,这有点痛苦 - 这只是傻瓜。