【问题标题】:How to include custom files with angular-cli build?如何在 angular-cli 构建中包含自定义文件?
【发布时间】:2017-01-25 02:16:14
【问题描述】:

RE:Angular2 2.0.0,angular-cli v1.0.0-beta.11-webpack.8

我如何告诉 angular-cli 在构建时将来自“src/assets”的文件包含在“dist”的根目录中?

我们部署到 Windows 主机并需要包含一个“web.config”文件来告诉 IIS 将所有内容路由到索引。我们是在 RC4 之前做的,但是随着所有的更新它都落空了(我不记得我们是怎么做到的)。

我一直在搜索GitHub repo docs 并没有发现任何与此主题相关的有用信息。是不是我走错地方了?

ToC 中,有一个要点“向构建中添加额外文件”,但该部分似乎不存在。

【问题讨论】:

  • 基本上你可以用 npm 复制文件。只需将脚本中的复制命令添加到 package.json 中。还要检查这个lucasmreis.github.io/blog/npm-is-an-amazing-build-tool
  • 我最终做了什么(这看起来也很老套):安装了一个文件复制 npm 包,然后在“package.json”的“脚本”部分添加了一个值,就像 "copy:webConfig": "node node_modules/copy/bin/cli.js web.config dist" 一样。我还添加了一个后期构建脚本:"postbuild": "npm run copy:webConfig"。尝试使副本正常工作时还有其他问题,但这成功了。
  • 嗯,Azure IIS 规则和 Angular CLI 的要求完全相同——如果可能,也不想添加更多构建步骤
  • 这里的答案是对的,但是如果您需要在每个环境中复制不同的文件,我建议您阅读:stackoverflow.com/a/59162533/3306960

标签: angular angular-cli


【解决方案1】:

angular-cli.json 文件中有一个“脚本”部分。您可以在那里添加所有第三方 javascript 文件。

【讨论】:

  • 是的,但是 web.config 不是 JavaScript 文件。它是否也会复制它而不期望它是 JS 并将其与 JS 的其余部分捆绑在一起?
  • @Kizmar,是的,这行不通。它将尝试(并失败)将其加载为 js。
【解决方案2】:

一种解决方案(虽然在我看来有点小题大做)是在您的 main.ts 文件中声明一个变量,该变量需要您想要包含在 webpack 构建输出中的额外文件。

前:

import './polyfills.ts';

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { environment } from './environments/environment';
import { AppModule } from './app/';

/* HACK: Include standalone web.config file manually in webpack build
 *
 * Due to the way the beta angular-cli abstracts the webpack config files into
 * angular-cli.json and lacks current documentation we were unable to find
 * a way to include additional files manually in the webpack build output.
 *
 * For hosting on IIS we need to include a web.config file for
 * specifying rewrite rules to make IIS compatible with the Angular Router.
 * The one liner following this comment is a hack to accomplish this
 * and should be reviewed and corrected as soon as adequete documentation
 * is available for the angular-cli configuration file.
 */
const webConfig = require('file?name=[name].[ext]!./web.config');

if (environment.production) {
    enableProdMode();
}

platformBrowserDynamic().bootstrapModule(AppModule);

当 webpack 在 main.ts 中遇到这个变量声明语句时,它将发出原始的 web.config 文件作为构建输出的一部分:

                            Asset       Size  Chunks             Chunk Names
                       inline.map    5.59 kB       2  [emitted]  inline
                       web.config  684 bytes          [emitted]
                 styles.bundle.js    16.7 kB    1, 2  [emitted]  styles
                        inline.js    5.53 kB       2  [emitted]  inline
                         main.map    5.36 MB    0, 2  [emitted]  main
                       styles.map    22.6 kB    1, 2  [emitted]  styles
                   main.bundle.js    4.85 MB    0, 2  [emitted]  main
                       index.html    1.98 kB          [emitted]
                assets/.npmignore    0 bytes          [emitted]
         assets/styles/global.css    2.74 kB          [emitted]
Child html-webpack-plugin for "index.html":
         Asset     Size  Chunks       Chunk Names
    index.html  4.45 kB       0
webpack: bundle is now VALID.

一个理想的解决方案是在 webpack 配置中,但我无法确定 angular-cli 是如何通过angular-cli.json 管理它的(beta.16)。

因此,如果有人有更好的答案来扩展 angular-cli 生成项目的 webpack 配置,我很乐意听到。

【讨论】:

    【解决方案3】:

    更新

    有关这方面的最新文档可在以下位置找到: https://angular.io/guide/workspace-config#assets-configuration

    下面的显着变化

    • 配置文件现在称为angular.json
    • 路径现在是相对于项目的根目录而不是src

    团队在更高版本的 Angular CLI(将是 beta 17 或 19 - 它已在最终的 1.x 版本中)添加了对将特定文件按原样复制到输出文件夹(默认为 dist)的支持年龄)。

    您只需将其添加到angular-cli.json 中的数组中即可:

    { ... “应用” [ { “根”:“src”, “资产”:[ “资产”, “网络配置” ], ... } ] ... }

    (注意路径是相对于src文件夹)

    我个人使用它,效果很好。

    从 beta 24 开始,我有 added a feature 到 Angular CLI 以确保在运行 ng test 而不仅仅是 ng serve 时从 webpack 开发服务器提供所有 assets 文件和文件夹。

    它还支持在用于单元测试的 webpack 开发服务器中提供资产文件 (ng test)。
    (如果您需要一些 JSON 文件进行测试,或者只是不想在控制台中看到 404 警告)。
    它们已经从ng e2e 提供服务,因为它运行完整的ng serve

    它还具有更高级的功能,例如从文件夹中过滤您想要的文件,以及使输出文件夹名称与源文件夹不同:

    { ... “应用” [ { “根”:“src”, “资产”:[ “资产”, “网络配置”: { //复制此文件夹中的内容 “输入”: ”../”, // 匹配这个通配符 "glob": "*.config", // 并将它们放在`dist`下的这个文件夹中('.'表示直接放在`dist`中) “输出”: ”。” } ], ... } ] ... }

    也可以参考官方文档:Angular Guide - Workspace configuration .


    .

    [仅用于存档] 原始答案(2016 年 10 月 6 日):

    不幸的是,目前不支持此功能(从 beta-16 开始)。我向团队提出了确切的担忧(web.config 文件),但它似乎不会很快发生(除非你正在分叉 CLI 等)。

    关注 this issue 以获取完整讨论和未来可能的详细信息。

    附言

    对于JSON文件,你可以把它放在./src/assets/。此文件夹按原样复制到 ./dist/assets/。这是当前的行为。

    在 systemJS 的早期,有另一个 ./public/ 文件夹被直接复制到 ./dist/,但是在 Webpack 版本中没有了,上面提到的问题讨论了这个问题。

    【讨论】:

    • 这个配置对我有用:{ "glob": "*/", "input": "src/assets", "output": "/assets" } ,
    • 根据当前的 Angular 资产配置,您应该只将此对象添加到您的资产列表中:{ "input": "./", "glob": "*.config", "output": "."} 在这种情况下,配置文件与 angular.json 位于同一位置(在根目录上项目的),并在构建后出现在 dist 文件夹内项目的根目录中
    【解决方案4】:

    angular-cli.json 的“assets”属性可以配置为在 angular-cli webpack 构建中包含自定义文件。因此,将“资产”属性值配置为数组。 例如:

    "assets": ["assets", "config.json",".htaccess"],
    

    上述配置将在 angular-cli webpack 构建期间将 config.jon 和 .htaccess 复制到 dist 文件夹中。以上设置适用于 angular-cli 版本 1.0.0-beta.18

    【讨论】:

    • 需要在 "apps" 下,例如:"apps": [ { "assets": [ "config/appConfig.json" ] }]
    • 看起来是真的,但对我不起作用。 "assets": "assets" 和 "assets": ["assets"] - 工作,但 "assets": ".htaccess", "assets": ["assets", ".htaccess"] - 不工作。有什么建议吗?
    • @gleb,添加如 "assets": ["assets", ".htaccess"] ,我认为这将达到您的目的。
    • @MdAyubAliSarker,谢谢,问题是我使用了 angular-cli 版本 1.0.0-beta.17。 1.0.0-beta.19 适合我
    • 好吧,忽略它,它是一种类型——它有效。所以 Web.config 需要进入 Src 文件夹的根目录,然后 JSON 文件看起来像 "assets": [ "assets", "web.config" ],
    【解决方案5】:

    在我的例子中,我使用了 Angular 版本 5, 所以我尝试在运行 ng build --prod 命令时创建名为 Staticfile.txt 的文件。 确保给出文件扩展名,否则它不会创建文件。

    【讨论】:

      【解决方案6】:

      对于 Angular 8 读者

      .htaccess需要是src/.htaccess。见下文,

       "assets": [
          "src/favicon.ico",
           "src/assets",
           "src/.htaccess"
        ],
      

      确保您已将.htaccess 文件放在项目的src 目录中。

      放入的文件是angular.json,而不是angular-cli.json

      (如果您需要一个有效的htaccess 文件,那么您可以在这里找到一个 - https://stackoverflow.com/a/57126352/767625

      就是这样。现在,当您点击 ng build --prod=true 时,应该会复制它。

      希望这对某人有所帮助。

      干杯,

      【讨论】:

      • 并且要放入的文件是angular.json,而不是前面答案中提到的angular-cli.json
      • 在 Angular 12 (2021) 中仍然可以这样工作。如果您使用 Angular CLI 生成项目,“assets”数组已经存在于 angular.json 中。您只需在其中添加您的文件。
      • 感谢@waldrabe 检查 Angular 12。干杯。
      【解决方案7】:

      修改 angular.json。
      向资产数组添加条目:

      {
        "glob": "**/web.config",
        "input": "src/",
        "output": "./"
      }
      

      【讨论】:

        猜你喜欢
        • 2017-09-01
        • 1970-01-01
        • 2017-07-05
        • 2018-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-04
        • 2015-01-03
        相关资源
        最近更新 更多