如何通过project.json脚本使构建失败

3
我有一个ASP.NET Core网页应用程序,使用webpack构建前端代码。Webpack通过npm调用,而npm又通过项目json中的脚本部分进行调用:
{
  ...
  "scripts": {
    "postcompile": "npm run build"
  }
}

“npm run build”调用如果构建失败,将进程退出代码设置为1。尽管从命令行或Visual Studio运行“dotnet build”不会失败-它会打印npm错误,但不会使构建失败。

我如何在我的project.json文件中配置一个额外的构建步骤,例如调用“npm run build”,如果该步骤失败,实际上会使构建失败?

2个回答

0

我在我们的构建服务器上遇到了与CI构建相同的问题。构建过程中出现错误,但CI构建并未失败。我无法在project.json脚本中找到解决问题的方法(dotnet.exe会忽略脚本的退出代码),但在.xproj文件中找到了解决办法。

ASP.NET Core项目目前由2个项目文件组成:每个项目都有一个project.json和一个.xproj文件。两者都能够运行某种类型的用户定义脚本。因此,我将我的脚本合并到了.xproj文件中,并从project.json中删除了它们。主要问题是找到一种在 .NET 代码编译之前调用这些脚本的有效方式。所以这里是我的.xproj文件。请注意目标BuildManagementConsole。

主要问题是我不能使用“dotnet build”命令构建项目,我必须使用“msbuild .xproj”命令行。我认为这种解决方案比将脚本合并到project.json中更好,因为Microsoft将在下一个版本的ASP.NET Core中删除它。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
  </PropertyGroup>
  <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
  <PropertyGroup Label="Globals">
    <ProjectGuid>d5feb23f-aaaa-4852-89c2-e1eef6ab52a8</ProjectGuid>
    <RootNamespace>ManagementConsole</RootNamespace>
    <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj\</BaseIntermediateOutputPath>
    <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
    <SccProjectName>SAK</SccProjectName>
    <SccProvider>SAK</SccProvider>
    <SccAuxPath>SAK</SccAuxPath>
    <SccLocalPath>SAK</SccLocalPath>
  </PropertyGroup>
  <PropertyGroup>
    <SchemaVersion>2.0</SchemaVersion>
  </PropertyGroup>
  <ItemGroup>
    <DnxInvisibleContent Include=".bootstraprc" />
    <DnxInvisibleContent Include=".npmrc" />
    <DnxInvisibleContent Include="npm-debug.log" />
  </ItemGroup>
  <ItemGroup>
    <DnxInvisibleFolder Include=".nuget\" />
  </ItemGroup>
  <Target Name="BuildManagementConsole" BeforeTargets="Build">
    <Exec Command="dotnet restore" />
    <Exec Command="npm cache clean --force" />
    <Exec Command="npm install" />
    <Exec Command="npm run build:$(Configuration)" />
  </Target>
  <Import Project="$(VSToolsPath)\DotNet.Web\Microsoft.DotNet.Web.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>

-1

如果错误来自webpack构建,请确保在webpack配置中将bail属性设置为true

来自文档:

bail
将第一个错误报告为硬错误,而不是容忍它。


我正在使用 https://www.npmjs.com/package/webpack-fail-plugin - 我认为这应该足够了。无论如何,我还添加了 --bail 选项,但没有成功。正如我所说,webpack 构建后进程退出代码已经设置为 1,但 dotnet 构建仍然没有失败。我是否正确设置了 bail 选项?在我的 package.json 中看起来是这样的: "build": "webpack --config builds/webpack.prod.config.js --bail", - Schweder
是的,这对于webpack应该足够了。但我不知道为什么“dotnet build”没有捕捉到它。 - jontem
我也是。这就是为什么我创建了这个问题的原因 :-)可能“npm run build”不应该从“postcompile”调用,而应该从某个不同的脚本入口点调用吗? - Schweder
OP提到的问题不在于npm的退出代码,而在于dotnet.exe如何处理其脚本(precompile、postcompile等)中的错误。 - Mike Eshva

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