【问题标题】:publish core build environment control发布核心构建环境控制
【发布时间】:2018-10-25 05:20:31
【问题描述】:

在调用 Publish 触发构建时传递给 webpack 的环境是什么控制?看看这个:

1>------ Build started: Project: MeshCut, Configuration: Debug Any CPU ------
1>MeshCut -> D:\MeshCut\bin\Debug\netcoreapp2.1\MeshCut.dll
2>------ Publish started: Project: MeshCut, Configuration: Debug Any CPU ------
MeshCut -> D:\MeshCut\bin\Debug\netcoreapp2.1\MeshCut.dll
npm install
audited 11025 packages in 7.787s
found 0 vulnerabilities

node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod
Hash: dadea967a4be0fa40482
Version: webpack 4.22.0

. . .
    Publish Succeeded.

========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
========== Publish: 1 succeeded, 0 failed, 0 skipped ==========

在第一行显然是调试版本,但这一行

node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod

显然通过了env.prod,这使得无法找出为什么在从 IDE 运行服务器时不会发生的生产错误。

我尝试将环境变量 ASPNETCORE_ENVIRONMENT 设置为“开发”,但这没有帮助,可能是因为这是运行时的事情。

最终这是一个 msbuild 的事情。 pubxml 文件和 csproj 文件的组合是 msbuild 的输入。

在 csproj 文件中 env.prod 是一个文字。如果有某种方法可以使此值取决于构建类型(发布/调试),则可以解决问题。

另一个问题的灵感来自基本相同的问题,但提问者对发现他可以通过编辑 csproj 来控制它感到满意。这对尊重发布/调试没有帮助。

这是一个 MSBUILD 的东西。这意味着查看 csproj 文件,果然我们找到了这个

<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
  <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec Command="npm install" />
    <Exec Command="node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod" />
    <Exec Command="node node_modules/webpack/bin/webpack.js --env.prod" />

并且很容易在第二个和第三个 Exec 语句中找到罪魁祸首。

剩下的问题是如何有条件地指定参数值,或者如何有条件地指定完全不同的命令行。

This Microsoft documentation 似乎描述了如何执行第二个选项,但 msbuild 不喜欢我尝试用 choosewhen 元素包装 exec 元素,我仍然可以使用一些帮助。

【问题讨论】:

  • 否,因为 dotnet 仅发布包,而 Visual Studio 的发布包并将包部署到网络服务器。它们是相关的,但另一个问题的答案也不是答案,而是一种解决方法。在这种情况下,您也可以编辑 csproj,但我不想编辑,我想让它尊重构建类型。

标签: msbuild .net-core msdeploy


【解决方案1】:

这是一个 MSBUILD 的东西。这意味着查看 csproj 文件,果然我们找到了这个

<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
  <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec Command="npm install" />
    <Exec Command="node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod" />
    <Exec Command="node node_modules/webpack/bin/webpack.js --env.prod" />

并且很容易在第二个 Exec 语句中找到罪魁祸首。

Exec 支持Condition 属性。幸运的是,在 CSPROJ 文件的其他地方,其中一个目标已经以我们需要的确切条件为条件。稍加复制/粘贴和调整,代码就变成了……

<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
  <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
  <Exec Command="npm install" />
  <Exec Command="node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.dev" 
        Condition=" '$(Configuration)' == 'Debug' " />
  <Exec Command="node node_modules/webpack/bin/webpack.js --env.dev" 
        Condition=" '$(Configuration)' == 'Debug' " />

  <Exec Command="node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod" 
        Condition=" '$(Configuration)' == 'Release' " />
  <Exec Command="node node_modules/webpack/bin/webpack.js --env.prod" 
        Condition=" '$(Configuration)' == 'Release' " />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2018-06-22
    相关资源
    最近更新 更多