ChatGPT解决这个技术问题 Extra ChatGPT

如何在 angular-cli 构建中包含自定义文件?

回复: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

m
mvermand

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"] ,我认为这将达到您的目的。
@MdAyubAliSacker,谢谢,问题是我使用了 angular-cli 版本 1.0.0-beta.17。 1.0.0-beta.19 适合我
好的,忽略它,它是一种类型 - 它有效。所以 Web.config 需要进入 Src 文件夹的根目录,然后 JSON 文件看起来像 "assets": [ "assets", "web.config" ],
M
Meligy

更新关于这方面的最新文档可以在以下位置找到:https://angular.io/guide/workspace-config#assets-configuration 下面的显着变化配置文件现在称为 angular.json 路径现在相对于根项目不是 src

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

您只需将其添加到 angular-cli.json 中的数组中,例如:

{
  ...
  "apps" [
    {
       "root": "src",
       "assets": [
         "assets",
         "web.config"
       ],
       ...
    }
  ]
  ...
}

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

我个人使用它,它工作得很好。

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

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

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

{
  ...
  "apps" [
    {
      "root": "src",
      "assets": [
        "assets",
        "web.config":
        {
          // Copy contents in this folder
          "input": "../",
          // That matches this wildcard
          "glob": "*.config",
          // And put them in this folder under `dist` ('.' means put it in `dist` directly)
          "output": "."
        }
      ],
      ...
    }
  ]
  ...
}

也可以参考官方文档: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" },
根据当前的角度资产配置,您应该只将此对象添加到您的资产列表中:{ "input": "./", "glob": "*.config", "output": "."} 在这种情况下,配置文件与 angular.json 位于同一位置(在项目的根目录上)并且在构建之后出现在 dist 文件夹内项目的根目录中
M
Manish

对于 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。干杯。
J
Joe Purdy

一种解决方案(尽管在我看来有点破解)是在您的 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 配置,我很乐意听到。


A
Alex Lin

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


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

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

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

N
Nadee

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