Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net MSBuild脚本和VS2010发布应用Web.config转换_Asp.net_Xml_Visual Studio 2010_Msbuild_Web Config Transform - Fatal编程技术网

Asp.net MSBuild脚本和VS2010发布应用Web.config转换

Asp.net MSBuild脚本和VS2010发布应用Web.config转换,asp.net,xml,visual-studio-2010,msbuild,web-config-transform,Asp.net,Xml,Visual Studio 2010,Msbuild,Web Config Transform,因此,我已经安装了VS 2010,并且正在为TeamCity构建集成修改我的MSBuild脚本。除了一个例外,一切都很好 如何告诉MSBuild我要应用发布生成时创建的Web.conifg转换文件 我有以下生成已编译网站的代码,但它将web.config、web.Debug.config和web.Release.config文件(全部3个)输出到已编译的输出目录。在studio中,当我执行“发布到文件系统”时,它将执行转换并仅输出带有适当更改的Web.config <Target Name

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

如何告诉MSBuild我要应用发布生成时创建的Web.conifg转换文件

我有以下生成已编译网站的代码,但它将web.config、web.Debug.config和web.Release.config文件(全部3个)输出到已编译的输出目录。在studio中,当我执行“发布到文件系统”时,它将执行转换并仅输出带有适当更改的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方式来完成

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


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

我正在寻找类似的信息,但没有完全找到,所以我在Visual Studio 2010和MSBuild 4.0附带的.targets文件中进行了一些挖掘。我认为这是查找执行转换的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>

C:\项目路径\此处
C:\Path to Deploy\此处
$(项目路径)\Web.config
$(项目路径)\Web.$(配置).config
$(部署路径)\Web.config
假的

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

您应该能够通过使用包目标并指定临时目录来实现这一点

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

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


我用它来代替模糊的msbuild目标。与app.config配合使用,而不仅仅是web.config

以下更改对我有效

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

在解决这个问题之前,我已经搜索了好几天,这是对这个主题的另一个回答:

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

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

我只是想明确我的意思:

命令行中的MSBuild语句

msbuild myproject.csproj-t:Clean-t:Rebuild/p:DeployOnBuild=true/p:PublishProfile=“开发”

有效

  • 发布配置文件名称:开发
  • 解决方案配置名称:开发
不起作用

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

希望这有帮助

这与我最终得到的解决方案非常相似。唯一需要注意的是,TransformXml操作当前有一个bug,它不会关闭源文件,因此无法删除源文件。只是需要考虑的事情;在我的例子中,在完成转换后,我希望从部署目录中删除Debug.config和Release.config文件。直到微软解决了这个问题。您可以简单地将源文件和转换文件复制到临时目录,然后将新转换的文件复制回来,然后您应该能够删除/删除文件…是的,我在尝试时也遇到了这个错误。这就是为什么我必须使用$(ProjectPath)和$(DeployPath)。实际上,我建议使用一个中间位置来收集所有构建工件(包括Web.config文件),然后从包含所有工件的位置部署到各个Web服务器。这将节省多次转换Web.config的时间,假设所有Web服务器都将使用完全相同的Web.config文件。+1用于解决我的问题,对我来说非常适合,很棒的发现!引用程序集的完整路径位于此处(在x64上)“C:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.Dll”。Jason所说的错误现已解决,我正在为msbuild.exe使用v12.0,它的工作原理类似于一个有趣的问题,即此方法不会将配置转换应用于连接字符串。所有web.config转换都应该使用此方法。为什么连接字符串不起作用呢?因为连接字符串的处理方式不同,你会看到一个可替换的令牌:除非你重写它,否则它会被放入一些非常随机的目录中,就像特洛伊在上面提到的我的bin folder下面的很多层,我只是将/p:AutoParameterizationWebConfigConnectionStrings=False添加到我的msbuild命令中,包现在包含最终的web.config转换。我使用的是nant,在我还添加了目标_WPPCopyWebApplication之前,TransformWebConfig目标将无法正常工作。这就解决了我的问题。这是一篇关于自定义转换的优秀文章:我们需要自定义web部署,因为我们不得不适应大量的经典ASP和其他不好的东西。这篇文章节省了挖掘MS目标的时间。
_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.