SlowCheetah在构建时没有转换web.config文件。

8
我通过nuget安装了SlowCheetah包并根据Build配置为我的web.config添加了转换文件。 然而,在构建时,web.config并没有被转换。我检查了我的项目文件并确实看到了SlowCheetah PropertyGroup和Import元素的条目。但是在项目文件中我没有找到转换的目标。 如果我添加一个app.config,那么app.config文件确实会被转换。 据我所知,安装SlowCheetah包应该自动为项目的MSBuild文件添加web.config转换目标。我可以手动添加它,但我认为SlowCheetah应该直接添加它。 我有什么遗漏吗?请告诉我。 我的需求是基于构建配置转换我的web.config文件,并将转换后的web.config文件放置在输出目录中。 感谢并欢迎所有帮助。
3个回答

19

只有在使用发布功能部署项目时,Visual Studio 才会进行转换。如果要在构建时执行转换,您需要调整 MSBuild 脚本。完整的解决方案在这里。以下是主要步骤:

项目中的文件:创建一个名为 Web.Base.config 的文件,与现有的 Web.Debug.config 和 Web.Release.config 文件并列。该文件将是旧的 Web.config 的等价物,因为它将成为转换的基础。您最终将拥有这些文件:

Web.config、Web.Base.config、Web.Debug.config、Web.Release.config 和 Web.config。在 .csproj 文件的尾部结束标签前添加以下配置:

<Target Name="BeforeBuild">
    <TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>

更新:从评论中的提醒我意识到,在发布项目时,Visual Studio也会将XML转换两次。解决方法是在Target标签中添加条件,如下所示:

<Target Name="BeforeBuild" Condition="'$(PublishProfileName)' == '' And '$(WebPublishProfileFile)' == ''">

2
关于这个解决方案,在Visual Studio 2013中,您不需要<Import>,因为<XmlTransform>任务已经被导入。 - MikeJansen
1
感谢分享。 - Philipp Stauss
1
yas yas yas yas ! - TWilly
6
这个问题是关于SlowCheetah的,它是一个扩展和NuGet包,应该可以为您做到这一点。 - Rudey
1
需要考虑的一个缺点是:正如Jacob Viau所指出的那样,这将破坏修改Web.config的NuGet包安装。 - Eric Eskildsen
显示剩余2条评论

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>

你能详细解释一下为什么构建过程没有替换之前复制到那里的配置文件吗?因为我无法让它正常工作,我认为是因为该文件被覆盖了。 - Rudey

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" />

2
对于任何正在观看的人来说,这对于当前版本的SlowCheetah来说是100%不正确的。 - EKW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接