【问题标题】:Cannot find module 'aspnet-webpack' when using 'dotnet publish' in .Net Core 2.0 & Angular在 .Net Core 2.0 和 Angular 中使用“dotnet publish”时找不到模块“aspnet-webpack”
【发布时间】:2018-04-05 07:49:58
【问题描述】:

我一直在尝试遵循此问题的答案,但无济于事。我正在尝试使用命令行命令“dotnet publish”发布我的 .Net Core 2.0 和 Angular 项目我成功发布,但是在尝试运行时我项目的 .dll 在已发布文件夹中,我的项目在开发环境中运行时会吐出此错误:

未处理的异常:System.AggregateException:发生一个或多个错误。 (Webpack 开发中间件因加载“aspnet-webpack”时出错而失败。错误为:错误:找不到模块“aspnet-webpack”

当在生产环境中运行并允许 DeveloperExceptionPage(如下面的 statup.cs 所示)时,.netcore 应用程序运行,但在实际的 Web 应用程序中崩溃,我认为这是由于更大的错误,aspnet-webpack 不是被发现:

NodeInvocationException:未捕获(承诺中):错误:未找到 HomeComponent 的组件工厂。你把它添加到@NgModule.entryComponents 了吗?

Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
                HotModuleReplacement = true
            });
        }
        else
        {
            //app.UseExceptionHandler("/Home/Error");
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");

            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
        });
    }
}

我没有使用@Angular/Cli,但我使用的是 VS2017(我相信是 8 月更新?)生成的默认 Angular 项目,它似乎只使用了 Webpack。问题似乎是项目的生产配置需要一个我没有提供的参考,但我不知道为什么会这样。

到目前为止,这个问题的其他答案对我没有帮助,所以如果这是一个重复的问题,我深表歉意。

【问题讨论】:

  • 您的声明“当在生产中运行并允许 DeveloperExceptionPage 时”,似乎是一个矛盾。如果环境设置为生产,则不会使用 DeveloperExceptionPage。您的环境变量“ASPNETCORE_ENVIRONMENT”的设置是什么?当您运行“dotnet xxx.dll”时,它会为“托管环境”打印什么?
  • 回复较晚,但可能对某人有所帮助.. 我认为这可能是因为您在 package.json @“devDependencies”的 devDependencies 中有 npm 包“aspnet-webpack”:{“aspnet- webpack": nnn } 并且在您的构建/发布的代码中不会考虑它,但是您尝试运行需要依赖项的“UseWebpackDevMiddleware HotModuleReplacement”。 (我来这里的原因是我遇到了同样的错误,因为我在将 React 应用程序“手动合并”到现有的 dotnet 核心应用程序时错过了在我的 package.json 中添加依赖项。)

标签: c# angular asp.net-core asp.net-core-2.0


【解决方案1】:

在发布 .Net Core 2.0 和 Angular 项目后,在运行它之前,您需要确保环境变量 ASPNETCORE_ENVIRONMENT 未设置为 Development。发布的项目不包括对 WebpackDevMiddleware 或 HotModuleReplacement 的支持。但如果环境设置为开发,它将尝试使用它们。

只要源文件发生更改,HotModuleReplacement 就会自动更新 Web 浏览器中 Webpack 构建的资源(例如 JavaScript、CSS 或图像)。这显然是您不希望在生产中出现的东西。

如果 ASPNETCORE_ENVIRONMENT 设置为“开发”,您可以通过以下方式更改设置:

setx ASPNETCORE_ENVIRONMENT "Production"

您需要关闭当前命令窗口并打开另一个命令窗口才能看到更改。

你也可以在startup.cs中注释掉下面的代码来达到同样的效果:

#if DEBUG
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
    HotModuleReplacement = true
});
#endif

【讨论】:

  • 这有帮助......但我首先将它设置为开发,因为一个模糊的错误。 :-/
  • 这对我也有帮助,虽然我的问题是由升级 dotnet 核心版本引起的,它会自动将环境变量添加到我的 web.config 中
  • 这修复了它!我们添加了一个专用的配置开关来打开和关闭 webpack dev 中间件,用于本地开发与通过 dotnet publish 创建的开发构建。
【解决方案2】:

确保您已完全安装所有这些依赖项:

npm install webpack-hot-middleware --save-dev
npm install webpack-dev-middleware --save-dev
npm install aspnet-webpack --save-dev

【讨论】:

    【解决方案3】:

    在我的情况下,原因是 SPA(在我的情况下是 Vue)位于 ClientApp 文件夹中,而 app.UseWebpackDevMiddleware 期望它位于项目根目录中。

    设置ProjectPath 选项为我解决了这个问题。

    app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
      {
        HotModuleReplacement = true,
        ConfigFile = Path.Combine(env.ContentRootPath, @"ClientApp\node_modules\@vue\cli-service\webpack.config.js"),
        ProjectPath = Path.Combine(env.ContentRootPath, @"ClientApp")
      });
    

    【讨论】:

      【解决方案4】:

      我对“aspnet-webpack”也有同样的问题,这是在项目开发的中途引入的,所以看到解决方案突然死亡我有点惊讶。这几个月在 IIS 上运行良好,但突然无法启动。

      IIS 日志文件没有帮助,所以我尝试了这两种方法,其中一种方法奏效了。 快点!

      解决方案

      我在包管理器窗口中运行了以下操作:

      dotnet run --project <Full path of *.csproj> --configuration Debug
      

      它给了我一些指示,我开始搜索“Error: Cannot find module 'aspnet-webpack'”问题。我尝试检查最后几次签入的所有更改,发现我们将“Microsoft.AspNetCore.All”从2.0.0 更新为2.0.3 版本,因此将其降级为原始版本修复了它。

      我猜他们都使用不同版本的节点包。因此,除非有很好的理由,否则不要为了缘故而更新。阅读这方面的一些内容非常紧密地耦合到特定版本,如果发生变化,Angular 很容易中断。虽然我已经设法将节点版本升级到最新的 5.0.0

      ,但正在进行中

      喜欢寻找更多细节,但暂时没有详细说明为什么它需要特定版本。

      【讨论】:

      • 有趣的是,我转移到一个 node.js 应用程序,完全删除了 .Net Core 组件,但我计划很快重新实现它以再次尝试。我相信这样的事情会很有帮助,谢谢!我同意,更多细节会很可爱..
      • 我希望解决这个从 2.0.5 降级到 2.0.0 的问题,正如你所说的 Sanjay,但我没有运气。我仍然遇到同样的错误。
      • @CarolinaBauque 您能否提供有关您在 Package Mgr 控制台上收到的错误详细信息的更多信息?
      • 我意识到我从来没有在这里评论过,但这个解决方案确实帮助了我。
      • 对我来说,我不得不将 package.json 中的“aspnet-webpack”从 2.0.3 降级到 2.0.0
      【解决方案5】:

      在没有 Angular 的项目中,我遇到了和你一样的错误:

      未处理的异常:System.AggregateException:发生一个或多个错误。 (Webpack 开发中间件因加载“aspnet-webpack”时出错而失败。错误为:错误:找不到模块“aspnet-webpack”

      原来是一个我容易忘记的简单节点问题。

      npm install
      

      请记住,npm 命令需要在包含您的 package.json 文件的顶级目录中运行。我希望这可以帮助那些像我一样记得实际运行 npm 命令的人。感谢论坛提醒我:

      https://www.ebenmonney.com/forum/?view=thread&id=20&part=1#postid-57

      【讨论】:

        【解决方案6】:

        检查 node.js 是否已安装在生产环境中并且在路径中。

        Node.js被webpack使用

        同时检查您是否拥有最新版本的 Node.js (4+)

        参考:AspNetCore + Angular 2: WebpackDevMiddleware Error with new project

        Node.js 的版本可以通过以下方式检查:

        where.exe node.exe (Windows 7+)
        
        which node.exe (linux bash)
        

        如果指向过时的Node.js

        ,当然应该检查和更新路径环境变量

        一切顺利

        【讨论】:

          【解决方案7】:

          startup.cs的AT配置函数开发环境可以使用if语句

           if (env.IsDevelopment())
                  {
                      // Print exception and all details for the developer 
                      app.UseDeveloperExceptionPage();
                      // Use WebPack to update css , js , html automatically 
                      app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
                      {
                          HotModuleReplacement = true
                      });  
          
                  }
                  else
                  {
                      app.UseExceptionHandler("/Error");
                      // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                      app.UseHsts();
          
                  } 
          

          您可以在命令 print 中使用此命令来更改当前环境: setx ASPNETCORE_ENVIRONMENT "开发"

          【讨论】:

            【解决方案8】:

            此错误的主要原因是您在代码中的某处使用了依赖项,并且它未安装在您的解决方案中。如果您使用的是 Visual Studio,请尝试使用 clean build,它会在您的项目中显示错误,这将帮助您找到它。

            【讨论】:

              猜你喜欢
              • 2017-12-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-11
              • 2018-12-08
              • 2018-02-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多