我们正在与团队城市建立持续集成,并在签到时进行构建。这工作正常,但它始终使用默认的web.config构建,它不会使用特定于开发环境的Web配置进行转换。 在Visual Studio中,我为开发创建了自定义构建配置。当我选择“开发”配置进行本地发布时,'web.development.config'会正确转换。但这不会发生在构建服务器上。 在团队城市,作为msbuild步骤的一部分,我创建了一个构建参数'sys.configuration',我将'development'作为值传递。但是当它运行时,生成的web.config不会使用开发设置进行转换。我也尝试将命令行参数设置为'/ p:configuration = development',但没有成功。
非常感谢任何帮助。
答案 0 :(得分:13)
我们一直在我们的Web应用程序项目中使用发布目标,并且已经看到构建过程正在转换我们的web.config文件,但是当我们将构建移动到CI服务器时,没有应用转换。 / p>
MSBuild脚本使用的是:
MSBuild.exe PATH_TO_PROJ.csproj /p:DeployOnBuild=true /p:PublishProfile=PUBLISH_TARGET
我们发现我们仍然需要将配置指定为调试或发布(即使这似乎是发布目标的属性。)
MSBuild.exe PATH_TO_PROJ.csproj /p:DeployOnBuild=true /p:PublishProfile=PUBLISH_TARGET /p:Configuration=Release
答案 1 :(得分:7)
我相信,使用MSBuild而不是Visual Studio发布时会发生配置转换,您需要在项目中添加TransformXml任务。
This answer提供了您需要添加的内容的指南,但是要保存点击次数:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<Target Name="BeforeBuild">
<TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
您可能需要将.targets文件的路径更改为与构建服务器上安装的任何版本一致。
答案 2 :(得分:3)
为了正确生成转换,需要满足多个条件
在.csproj中,请确保您拥有以下所有内容:
<Project> ...
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />
<Target Name="SetTransformAppConfigDestination" BeforeTargets="PrepareForBuild" Condition="exists('Web.$(Configuration).config')">
<PropertyGroup>
<!-- Force build process to use the transformed configuration file from now on. -->
<AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
</PropertyGroup>
<Message Text="AppConfig transformation destination: = $(AppConfig)" />
</Target>
<Target Name="TransformAppConfig" AfterTargets="PrepareForBuild" Condition="exists('Web.$(Configuration).config')">
<TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="$(AppConfig)" />
</Target>
</Project>
同时更新.csproj文件中的项目组。
<ItemGroup> ...
<Content Include="Web.config">
<SubType>Designer</SubType>
</Content>
<Content Include="Web.Debug.config">
<DependentUpon>Web.config</DependentUpon>
</Content>
<Content Include="Web.Release.config">
<DependentUpon>Web.config</DependentUpon>
<IsTransformFile>True</IsTransformFile>
</Content>
<Content Include="Views\Web.config" />
<Content Include="Views\Home\Index.cshtml" />
</ItemGroup>
这将导致您的配置文件嵌套在资源管理器视图中
然后确保在属性中正确设置路径 - &gt;建立
然后添加到要转换的每个节点的web.release.config标记
看起来像这样:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings xdt:Transform="Replace">
<add key="VariableToBeTransformed" value="ValueToInsert"/>
</appSettings>
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>
</configuration>
希望这对每个人都有帮助,你可以为app.config做同样的事情
答案 3 :(得分:0)
如果您使用的是Visual Studio 2019(在此示例中为社区版),则最新的msbuild.exe的路径如下所示: “ C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Community \ MSBuild \ Current \ Bin \ MSBuild.exe”
,您可以通过以下方式创建msstrong textbuild脚本:
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=Release /p:VisualStudioVersion=16.0
其中的参数 DeployOnBuild 在构建后会触发多个目标,其中有一个目标可以转换web.config。 "The DeployOnBuild=true property essentially means "I want to execute an additional target when build completes successfully."
答案 4 :(得分:0)
Publish
中的Visual studio
函数在您的项目中使用PublishProfiles/foo.pubxml
来确定您的配置,而MSBuild
从project.sln
中来确定您的配置。
您需要从Configuration Manager
打开Solution Explorer
→选择Active solution configuration
→更改Configuration
下的Project contexts