发布核心构建环境控制
publish core build environment control
在调用 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 设置为 "Development" 但这没有帮助,可能是因为这是 运行 时间的事情。
最终这是一个 msbuild 问题。 pubxml 文件和 csproj 文件的组合是 msbuild 的输入。
在 csproj 文件中 env.prod 是文字。如果有某种方法可以使此值取决于构建类型 (release/debug),则问题可以得到解决。
还有一个问题的灵感来自于基本相同的问题,但提问者很满意地发现他可以通过编辑 csproj 来控制它。这对尊重 release/debug.
没有帮助
这是 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 不喜欢我尝试用 choose
和 when
元素包装 exec 元素,我仍然可以使用一些帮助。
这是 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 文件的其他地方,目标之一已经以我们需要的确切条件为条件。稍加 copy/paste 和调整,代码就变成了...
<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' " />
在调用 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 设置为 "Development" 但这没有帮助,可能是因为这是 运行 时间的事情。
最终这是一个 msbuild 问题。 pubxml 文件和 csproj 文件的组合是 msbuild 的输入。
在 csproj 文件中 env.prod 是文字。如果有某种方法可以使此值取决于构建类型 (release/debug),则问题可以得到解决。
还有一个问题的灵感来自于基本相同的问题,但提问者很满意地发现他可以通过编辑 csproj 来控制它。这对尊重 release/debug.
没有帮助这是 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 不喜欢我尝试用 choose
和 when
元素包装 exec 元素,我仍然可以使用一些帮助。
这是 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 文件的其他地方,目标之一已经以我们需要的确切条件为条件。稍加 copy/paste 和调整,代码就变成了...
<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' " />