我通过 nuget 安装了 SlowCheetah 包,并基于构建配置为我的 web.config 添加了转换文件。但是,在构建时,web.config 不会被转换。我检查了我的项目文件,确实看到了 SlowCheetah PropertyGroup 和 Import 元素的条目。我在项目文件中没有看到转换目标。如果我添加一个 app.config,app.config 文件会被转换。据我了解,安装 SlowCheetah 包应该会自动将 web.config 转换目标添加到项目的 MSBuild 文件中。我可以手动添加它,但我认为 SlowCheetah 是开箱即用的。我是不是错过了什么。请务必让我知道。我的要求是我的 web.config 文件应该根据构建配置进行转换,并且转换后的 web.config 文件应该位于输出目录中。
3 回答
仅当您使用发布功能部署项目时,Visual Studio 才会执行转换。要在构建时执行此操作,您需要调整 MSBuild 脚本。完整的解决方案在这里。这里的要点:
项目中的文件 除了现有的 Web.Debug.config 和 Web.Release.config 之外,创建一个名为 Web.Base.config 的文件。该文件将等同于您的旧 Web.config,因为它将是转换的基础。你最终会得到这些文件:
Web.config、Web.Base.config、Web.Debug.config、Web.Release.config 和 Web.config。将以下配置添加到 .csproj 文件的底部,就在关闭 -tag 之前:
<Target Name="BeforeBuild">
<TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
更新:从评论中的提醒中,我意识到在发布项目时,Visual Studio 两次转换 XML 也存在问题。解决方案是向 Target-tag 添加一个 Condition,如下所示:
<Target Name="BeforeBuild" Condition="'$(PublishProfileName)' == '' And '$(WebPublishProfileFile)' == ''">
为了详细说明 Philipp 的回答,我找到了一个可能更简单的解决方案:不需要 Web.Base.Config 并且覆盖您的 web.config 没有问题,这会导致源代码管理出现问题。
BeforeBuild:将目标设为 TargetDir 和 TargetFileName。
AfterBuild:构建完成后,您将其复制到您发布的网站。
<Target Name="BeforeBuild">
<TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="$(TargetDir)$(TargetFileName).config" />
</Target>
<Target Name="AfterBuild" Condition="'$(Configuration)' == 'Dev' Or '$(Configuration)' == 'Test' Or '$(Configuration)' == 'Prod'">
<Delete Files="$(TargetDir)_PublishedWebsites\$(ProjectName)\Web.config" />
<Copy SourceFiles="$(TargetDir)$(TargetFileName).config" DestinationFiles="$(TargetDir)_PublishedWebsites\$(ProjectName)\Web.config" />
</Target>
您是否将转换文件的“复制到输出目录”属性设置为“不复制”?请检查您的项目文件。
在您的项目文件中,应添加以下条目(取决于您安装的版本,在本例中为 2.5.7):
<PropertyGroup Label="SlowCheetah">
<SlowCheetah_EnableImportFromNuGet Condition=" '$(SC_EnableImportFromNuGet)'=='' ">true</SlowCheetah_EnableImportFromNuGet>
<SlowCheetah_NuGetImportPath Condition=" '$(SlowCheetah_NuGetImportPath)'=='' ">$([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\..\packages\SlowCheetah.2.5.7\tools\SlowCheetah.Transforms.targets ))</SlowCheetah_NuGetImportPath>
<SlowCheetahTargets Condition=" '$(SlowCheetah_EnableImportFromNuGet)'=='true' and Exists('$(SlowCheetah_NuGetImportPath)') ">$(SlowCheetah_NuGetImportPath)</SlowCheetahTargets>
<Import Project="$(SlowCheetahTargets)" Condition="Exists('$(SlowCheetahTargets)')" Label="SlowCheetah" />