在.NET 4.0中使用msbuild,我可以使用“Package”目标构建web项目,并且可以将包放在zip文件中。但是,当我在那里查看web.config时,它没有被转换,它有“$(ReplacableToken_Web_SiteConnection-Web.config Connection String_0)”
我可以运行“TransformWebConfig”目标,它将进行正确的转换,但只是在自己的孤岛中。
我还可以运行“Build”目标并传递“DeployOnBuild = True; DeployTarget = MSDeployPublish”属性,它将在我的服务器上部署包,并完成正确的web.config转换。
但是,如果我想手动将软件包部署到服务器,如何使用“TransformWebConfig”执行“Package”,以便zip文件中包含最终的web.config?
答案 0 :(得分:12)
如果您想跳过这种情况,则需要在构建中设置属性。你可以用两种方式做到这一点
我会推荐#2。对于这种情况,请在与项目文件相同的目录中创建一个名为{ProjectName} .wpp.targets的新文件,其中{ProjectName}是项目的名称。然后在这个文件里面放置以下内容。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0">
<PropertyGroup>
<AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings>
</PropertyGroup>
</Project>
在这种情况下,您要设置属性AutoParameterizationWebConfigConnectionStrings
,告知Web发布管道不要在web.config中为连接字符串插入这些{}占位符。
答案 1 :(得分:10)
我们这样做的方法是修改项目构建以在打包之前进行转换。
目标是调用TransformXml并且是Microsoft.Web.Publishing.Tasks.dll的一部分
在你自己的目标中
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
但它将包含在默认的VS C#build中。
所以
<TransformXml Source="web.config" Transform="web.release.config" Destination="$(DeployPath)\web.config" />
我们的诀窍。
使用正确的ItemGroup(最有可能是“内容”)设置这些路径,并确保在.csproj中调用Package之前触发目标,并且构建输出将包含“Web.config”,就像正常一样,使用正确的转换值。
或者(我们已经将它用于需要每个人的所有内容的软件包),您可以使用该技巧完成所有转换并将其中的每一个包含在最终包中。
然后手动调用Msdeploy并使用其skip和replace指令(忘记技术术语)仅在部署时输出正确的指令
假设您的包中有web.usethisone.config,看起来像
-skip:objectname=filepath,absolutepath=web\..*\.config
-replace:objectName=filepath,match=.*web\.usethisone\.config,replace=web.config