MSBuild 脚本和 VS2010发布应用 Web.config 变换

因此,我已经安装了 VS2010,并且正在为我们的 TeamCity 构建集成修改 MSBuild 脚本。除了一个例外,一切都很顺利。

如何告诉 MSBuild 我想应用在发布构建时创建的 Web.conifg 转换文件..。

下面的代码生成了编译后的网站,但是它输出一个 Web.config,Web。Config 和 Web。Config 文件(全部3个)到已编译的输出目录。在工作室中,当我执行发布到文件系统时,它将执行转换,并且只输出带有适当更改的 Web.config..。

<Target Name="CompileWeb">
<MSBuild Projects="myproj.csproj" Properties="Configuration=Release;" />
</Target>


<Target Name="PublishWeb" DependsOnTargets="CompileWeb">
<MSBuild Projects="myproj.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputFolder)$(WebOutputFolder);
OutDir=$(TempOutputFolder)$(WebOutputFolder)\;Configuration=Release;" />
</Target>

任何帮助将是伟大的. . !

我知道这可以通过其他方式做到这一点,但我想这样做,使用新的 VS 2010方式,如果可能的话

31437 次浏览

我不是 MSBuild 的专家,但是我能够使用这个链接中的信息来完成同样的任务:

Http://www.hanselman.com/blog/managingmultipleconfigurationfileenvironmentswithprebuildevents.aspx

在文章的底部附近有一个与 MSBuild 相关的部分。希望这有所帮助。

我正在寻找类似的信息,但没有找到,所以我做了一些调查。目标文件是 Visual Studio 2010和 MSBuild 4.0附带的文件。我认为这是查找执行转换的 MSBuild 任务的最佳位置。

据我所知,使用了以下 MSBuild 任务:

<Project ToolsVersion="4.0"
DefaultTargets="Deploy"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">


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


<PropertyGroup>
<ProjectPath>C:\Path to Project\Here</ProjectPath>
<DeployPath>C:\Path to Deploy\There</DeployPath>
<TransformInputFile>$(ProjectPath)\Web.config</TransformInputFile>
<TransformFile>$(ProjectPath)\Web.$(Configuration).config</TransformFile>
<TransformOutputFile>$(DeployPath)\Web.config</TransformOutputFile>
<StackTraceEnabled>False</StackTraceEnabled>
</PropertyGroup>




<Target Name="Transform">
<TransformXml Source="$(TransformInputFile)"
Transform="$(TransformFile)"
Destination="$(TransformOutputFile)"
Condition="some condition here"
StackTrace="$(StackTraceEnabled)" />
</Target>
</Project>

我已经测试了以上,可以证实它的工作。您可能需要稍微调整一下结构,以更好地适应构建脚本。

您应该能够通过使用 Package 目标并指定 temp 目录来实现这一点。

msbuild solution.sln /p:Configuration=Release;DeployOnBuild=true;DeployTarget=Package;_PackageTempDir=..\publish

Http://pattersonc.com/blog/index.php/2010/07/15/visual-studio-2010-publish-command-from-msbuild-command-line/

或者,您可以尝试使用 XDT 转换工具:

Http://ctt.codeplex.com

我正在使用这个,而不是搞乱模糊的 msbuild 目标。

以下的改变对我很有效

<MSBuild Projects="$(ProjectFile)"
Targets="ResolveReferences;_WPPCopyWebApplication"
Properties="WebProjectOutputDir=TempOutputFolder;OutDir=$(WebProjectOutputDir);Configuration=$(Configuration);" />

来自 MsBuild 文件夹下的 Microsoft.WebApplication.target 文件

_CopyWebApplication


This target will copy the build outputs along with the
content files into a _PublishedWebsites folder.


This Task is only necessary when $(OutDir) has been redirected
to a folder other than ~\bin such as is the case with Team Build.


The original _CopyWebApplication is now a Legacy, you can still use it by
setting $(UseWPP_CopyWebApplication) to true.
By default, it now change to use _WPPCopyWebApplication target in
Microsoft.Web.Publish.targets.
It allow to leverage the web.config trsnaformation.

这个问题的另一个答案是:

您的发布配置文件和配置名称应该匹配。

对我来说,我的没有。通过发布配置文件手动发布给了我想要的结果,因为我的配置是在发布配置文件中设置的。然而,MSBuild 尝试智能化,并神奇地根据名称连接发布配置文件和配置。(在命令中添加/p: Configuration 会导致关于被引用项目的输出路径的其他奇怪错误)。

我只是想说清楚我的意思:

从命令行构建 MSBuild 语句

Csproj-t: Clean-t: Rebuild/p: DeployOnBuild = true/p: PublishProfile = “ Development”

工作

  • 发布配置文件名 : 开发
  • 解决方案配置名称 : Development

没用的

  • 发布配置文件名 : 开发
  • 解决方案配置名称 : Dev

希望这个能帮上忙!