复制带有web.config转换的Web应用程序

44

我正在尝试在Release构建时自动发布我的Web应用程序。我使用_CopyWebApplication目标来实现这一点。我将以下内容添加到我的.csproj文件中:

  <!-- Automatically Publish in Release build. -->
  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
  <Target Name="AfterBuild">
    <RemoveDir Directories="$(ProjectDir)..\Output\MyWeb" ContinueOnError="true" />
    <MSBuild Projects="MyWeb.csproj" Properties="Configuration=Release;WebProjectOutputDir=$(ProjectDir)..\Output\MyWeb;OutDir=$(ProjectDir)bin\" Targets="ResolveReferences;_CopyWebApplication" />
  </Target>

这个方法可以使用,但存在一个问题。使用 MSBuild 方法时生成的输出与使用 Visual Studio 的“发布”菜单项生成的输出之间的区别在于,Web.Release.config 转换未应用于 Web.config 文件。 相反,复制了 Web.config、Web.Release.config 和 Web.Debug.config。

欢迎任何想法。

1个回答

76

我为此一直在苦苦挣扎。在浏览了MSBuild目标后,我发现有些内容非常“晦涩难懂”。

简而言之:尝试使用新的_WPPCopyWebApplication。这在我的机器上有效。由于历史原因,旧的_CopyWebApplication不支持转换。以下是我的做法:

msbuild /t:Rebuild /p:OutDir=..\publish\;Configuration=Release;UseWPP_CopyWebApplication=True;PipelineDependsOnBuild=False MvcApplication1\MvcApplication1.csproj

# UseWPP_CopyWebApplication = true requires PipelineDependsOnBuild = false

长话短说:

看一下VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets。它有很大的问题。在第70行找到_CopyWebApplication。注释如下:

原来的_CopyWebApplication现已过时,您仍然可以通过将$(UseWPP_CopyWebApplication)设置为true来使用它。 默认情况下,现在改用Microsoft.Web.Publish.targets中的_WPPCopyWebApplication目标。 它允许利用web.config转换。[所有的字面意思]

糟糕了。UseWPP_CopyWebApplication默认为false(第27行),如果您不想破坏现有的_CopyWebApplication,这是有意义的。因此,将其设置为true将实际上使用引入到VS 2010的新的WPP工具。我更喜欢这个方法而不是调用“隐藏”的目标。


我想知道是否有一种方法可以修复将通过其他项目引用的库复制到msbuild输出目录中的问题? - Johnny_D
我尝试使用WebDeploy和使用pubxml文件来完成/p: WebPublishMethod = FileSystem。但是我无法使其正常工作。这个解决方案是我发现的最佳方式。一个建议是:如果没有设置OutDir属性,就无法使其正常工作。即使它已经在项目属性中定义,您仍需要将其包含在命令行中。 - Dave Welling
2
当使用/p:OutDir=..\publish\重定向构建输出文件时,这也有助于解决编译TypeScript文件的问题。 - Kris McGinnes

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