13

在 .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”执行“包”,以便 zip 文件中包含最终的 web.config?

4

2 回答 2

12

如果您想避免这种情况发生,那么您需要在构建中设置一个属性。你可以通过两种方式做到这一点

  1. 编辑您的项目文件
  2. 创建一个 .wpp.targets 文件

我会推荐#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 中为连接字符串插入那些 {} 占位符。

于 2010-10-13T05:05:32.197 回答
10

我们这样做的方法是在打包之前修改项目构建以进行转换。

目标是调用 TransformXml 并且是 Microsoft.Web.Publishing.Tasks.dll 的一部分

在你自己的目标中

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"  /> 

但它将包含在默认的 VS C# 构建中。

所以

<TransformXml Source="web.config" Transform="web.release.config" Destination="$(DeployPath)\web.config" />

对我们有用。

使用正确的 ItemGroup(最有可能是“内容”)设置这些路径,并确保在调用 .csproj 中的 Package 之前触发目标,并且构建输出将包含正常的“Web.config”,其中正确的转换值。

或者(我们已经将它用于需要对每个人都适用的包),您可以使用该技巧进行所有转换并将它们中的每一个都包含在最终包中。

然后您手动调用 Msdeploy 并使用它的跳过和替换指令(忘记技术术语)仅在部署时输出正确的指令

假设你的包中有一个 web.usethisone.config,看起来像

-skip:objectname=filepath,absolutepath=web\..*\.config 

-replace:objectName=filepath,match=.*web\.usethisone\.config,replace=web.config
于 2010-09-01T23:26:56.707 回答