【问题标题】:.NET Core csproj PublishProfileName has a value when building.NET Core csproj PublishProfileName 在构建时有一个值
【发布时间】:2019-11-08 20:00:14
【问题描述】:

我正在使用以下示例动态生成Web.config 文件:

https://sebnilsson.com/blog/asp-net-transform-web-config-with-debug-release-on-build/

更改包括在常规 .NET 中工作的 .csproj 中:

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

但是,当在 .NET Core 中使用类似的行时,它不起作用,因为 PublishProfileName 实际上是“文件系统”。我想要的是一种检测发布(与构建)的方法,以避免两次修改 Web.config 的问题。这是 .NET Core 的修改部分:

  <Target Name="TestTarget" AfterTargets="Build">
    <Message Importance="High" Text="Firing on publish due to PublishProfile being '$(PublishProfileName)'" />
    <TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
  </Target>

有谁知道如何在 .NET 核心中执行与 .NET 中相同的操作,以在动态生成时停止对 web.config 的双重修改?

【问题讨论】:

    标签: c# asp.net visual-studio asp.net-core msbuild


    【解决方案1】:

    我想要的是一种检测发布(与构建)以避免问题的方法 两次修改 Web.config。

    我认为最简单的方法是在您的目标中使用Condition="'$(DeployOnBuild)' != 'true'"。 那么这个目标只会在构建过程中执行,而不是发布过程。

    <Target Name="TestTarget" Condition="'$(DeployOnBuild)' != 'true'" AfterTargets="Build">
        <Message Importance="High" Text="Firing on publish due to PublishProfile being '$(PublishProfileName)' and " />
        <!--<TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" />-->
      </Target>
    

    这将确保当您通过 FileSystem 在 VS 中发布项目时,它只会执行目标 once in build 而不是 twice in build and publish。我不知道你为什么设置AfterTargets="Build",根据你上面提到的文章,它可能是BeforeTargets="Build"

    【讨论】:

    • 感谢您的回复。我会尝试你的解决方案。我必须使用 AfterTargets="build" 而不是 BeforeTargets 因为 BeforeTargets 对我不起作用。这篇文章stackoverflow.com/questions/27986147/… 建议使用 BeforeTargets="BeforeBuild" 但这对我也不起作用。最后,如果它是在构建之前或之后,无论如何都没有关系,所以没关系。
    • @automaton 如有任何更新,请随时与我联系:) 如果 DeployOnBuild 不起作用,您可以分享一些详细信息,以便我们重现它。
    • 所以这绝对有效,谢谢。然而,新的问题出现了。这适用于本地构建,但在我们的构建服务器上它失败并出现依赖项需要绑定重定向的错误。问题是绑定重定向位于动态生成的 web.config 文件中。我试过&lt;Target Name="CreateWebConfig" BeforeTargets="ResolveAssemblyReferences"&lt;Copy SourceFiles="Web.Base.config" DestinationFiles="Web.config" /&gt; 但它没有解决它,即使作为内容包含在csproj中也是如此。所以现在我又被卡住了。
    • @automaton 构建服务器是否使用未安装 VS 的构建工具包?从构建工具中构建和发布 msbuild.exe 时会出现错误?大多数情况下,通过 VS 和 Build Tools Package 构建时结果应该是相同的,所以我假设您的服务器中是否缺少某些组件。或许你可以开一个新帖子,分享一下这个新问题的细节,并在那里分享原始错误信息,以便我们深入研究:)
    • 经过大量努力,可以通过在命令行上使用 msbuild(但不是 VS)来复制问题。诊断模式表示当 Web.config 在构建期间磁盘上不存在时未设置 AppConfigWithTargetPath(第二次构建有效)。解决方案是在具有 2 个目标的项目上使用 InitialTargets,如果文件不存在,1 个使用 AppConfigWithTargetPath,另一个始终生成 Web.config。这是一个非常愚蠢的问题,我相信这是 msbuild 中的一个错误,但这是我可以调试的范围。感谢您的帮助。
    猜你喜欢
    • 2017-08-08
    • 2017-08-16
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    相关资源
    最近更新 更多