【问题标题】:How to fail the build from project.json scripts如何使 project.json 脚本的构建失败
【发布时间】:2016-12-21 14:41:12
【问题描述】:

我有一个 ASP.NET Core webapp,它使用 webpack 构建前端代码。 Webpack 是通过 npm 调用的,而 npm 又是通过我的 project.json 中的脚本部分调用的:

{
  ...
  "scripts": {
    "postcompile": "npm run build"
  }
}

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

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

【问题讨论】:

    标签: npm asp.net-core webpack .net-core project.json


    【解决方案1】:

    我在构建服务器上构建 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 中更好,因为微软将在下一版本的 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>
    

    【讨论】:

      【解决方案2】:

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

      来自docs

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

      【讨论】:

      • 我正在使用npmjs.com/package/webpack-fail-plugin - 我认为这应该足够了。无论如何,我还添加了 --bail 选项,但没有成功。正如我所说,在 webpack 构建之后进程退出代码已经设置为 1,但 dotnet 构建仍然没有失败。我是否正确设置了保释选项?在我的 package.json 中看起来像:“build”:“webpack --config builds/webpack.prod.config.js --bail”,
      • 是的,这对于 webpack 来说已经足够了。但我不知道为什么dotnet build 不接它
      • 我也没有。这就是我创建这个问题的原因 :-) 难道不应该从“postcompile”而是从一些不同的脚本入口点调用“npm run build”吗?
      • OP 提到问题不在于 npm 退出代码,而在于 dotnet.exe 如何处理其脚本中的错误(预编译、后编译等)
      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 2022-11-23
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多