8

我通过 nuget 安装了 SlowCheetah 包,并基于构建配置为我的 web.config 添加了转换文件。但是,在构建时,web.config 不会被转换。我检查了我的项目文件,确实看到了 SlowCheetah PropertyGroup 和 Import 元素的条目。我在项目文件中没有看到转换目标。如果我添加一个 app.config,app.config 文件会被转换。据我了解,安装 SlowCheetah 包应该会自动将 web.config 转换目标添加到项目的 MSBuild 文件中。我可以手动添加它,但我认为 SlowCheetah 是开箱即用的。我是不是错过了什么。请务必让我知道。我的要求是我的 web.config 文件应该根据构建配置进行转换,并且转换后的 web.config 文件应该位于输出目录中。

4

3 回答 3

19

仅当您使用发布功能部署项目时,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)' == ''">
于 2014-01-10T08:40:40.543 回答
6

为了详细说明 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>
于 2017-02-02T16:32:05.913 回答
0

您是否将转换文件的“复制到输出目录”属性设置为“不复制”?请检查您的项目文件。

在您的项目文件中,应添加以下条目(取决于您安装的版本,在本例中为 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" />
于 2013-09-12T09:23:14.337 回答