發行 Angular Schematics 程式產生器與設定 .npmignore 的注意事項

栏目: 编程语言 · AngularJS · 发布时间: 6年前

内容简介:昨天寫了一個這邊我就先示範一個簡單的 Schematics 程式產生器設計過程。這邊我來示範一個可以自動產生

昨天寫了一個 小工具 ,可以自動將現有 Angular CLI 建立的專案,轉換成有 Hot Module Replacement (HMR) 功能的版本,只要簡單一個命令 ng add hmr-enabled 就可以搞定,非常方便。不過我在發布專案到 npm registry 的過程中,卻意外遺漏了幾個重要的檔案,原來是有檔案被 .npmignore 給忽略掉了,到了今天傍晚才修復。我們就立刻來看看這個錯誤是怎樣發生的!

建立 Angular Schematics 專案

這邊我就先示範一個簡單的 Schematics 程式產生器設計過程。

  1. 安裝開發工具

    npm install -g @angular-devkit/schematics-cli
  2. 建立專案骨架

    schematics blank --name=willh

    如果你想建立一個含有範例程式的專案,也可以考慮用以下命令建立範本:

    schematics schematics --name=willh-with-example

    上述兩種語法,也有另外一種寫法,不過比原本的指令會長很多:

    schematics @schematics/schematics:blank     --name my-schematics-1
    schematics @schematics/schematics:schematic --name my-schematics-2
  3. 安裝 npm 套件

    cd willh
    npm install

建立第一支程式碼產生器

這邊我來示範一個可以自動產生 /src/environments/environment.{name}.ts 檔案的程式產生器,而且只要執行 ng g willh:env hmr 就會自動產生 /src/environments/environment.hmr.ts 檔案。我們第一版先不用做太複雜,產生固定的內容就好。

  1. 檢查 package.json 所定義的 schematics 設定,預設會指向 ./src/collection.json 這個檔案。

  2. 調整 src/collection.json 檔案內容如下:

    {
      "$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
      "schematics": {
        "env": {
          "description": "generates environment file",
          "factory": "./env/index#env",
          "schema": "./env/schema.json"
        }
      }
    }
  3. 建立 src/env/schema.json 檔案,讓程式可以接受 name 參數,並且讓 name 參數直接接在參數列上,不用特別透過 --name 選項進行設定。檔案內容如下:

    {
      "$schema": "http://json-schema.org/schema",
      "id": "EnvSchema",
      "title": "Env Schematics Schema",
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the environment.",
          "$default": {
            "$source": "argv",
            "index": 0
          }
        }
      }
    }
  4. 建立 src/env/index.ts 檔案內容如下:

    import {
      Rule, mergeWith, template, apply, url
    } from '@angular-devkit/schematics';
    
    export function env(options: any): Rule {
      return () => {
        return mergeWith(
          apply(url('./files'), [
            template({
              name: options.name
            })
          ])
        );
      };
    }
  5. 建立一個 src/env/files/src/environments/environment.__name__.ts 檔案,檔名的部分 __name__ 會在產生檔案的時候,動態置換成 name 參數的內容。

    // This file can be replaced during build by using the `fileReplacements` array.
    // `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.
    // The list of file replacements can be found in `angular.json`.
    
    export const environment = {
      production: false
    };
    
    /*
    * In development mode, for easier debugging, you can ignore zone related error
    * stack frames such as `zone.run`/`zoneDelegate.invokeTask` by importing the
    * below file. Don't forget to comment it out in production mode
    * because it will have a performance impact when errors are thrown
    */
    // import 'zone.js/dist/zone-error';  // Included with Angular CLI.
  6. 建置專案

    npm run build
  7. 本地測試安裝

    npm link

    執行 npm link 會將目前專案自動連結到 npm 的 全域模組 中。

  8. 本地測試執行

    透過全域的 schematics 工具就可以執行這個命令。如下範例命令執行完後,就會自動產生 /src/environments/environment.ok.ts 檔案:

    schematics willh:env ok
  9. 在 Angular CLI 專案中透過 ng generate 進行測試

    要在特定專案中執行 ng generate 的話,必須透過本地 npm 安裝才能使用。你可以直接透過 npm install <folder> 直接將開發中的目錄,當成套件安裝到目前的 Angular 開發專案目錄中。

    npm install G:\Projects\willh

    安裝好之後,就可以順利的使用 ng g willh:env ok 命令來產生檔案。

準備發行 npm 套件

一切準備就緒的時候,就是魔鬼出現的時刻!

我今天就是發現到,透過 schematics blank 產生的專案範本,預設所建立的 .npmignore 檔案是有問題的。這份檔案,主要是將 *.ts 檔案從發行檔案中排除,只留下 TypeScript 編譯後的 *.js 檔。但留下所有 *.d.ts 模組定義檔。檔案內容如下:

# Ignores TypeScript files, but keeps definitions.
*.ts
!*.d.ts

這個 .npmignore 檔案,最主要的目的,就是讓 npm 套件在發布的時候,將特定檔案/目錄排除在發行的檔案清單中。正常來說,排除掉 *.ts 與保留 *.d.ts 是蠻合理的。但在我們本次建立的 Angular Schematics 專案中,有個 src/env/files/ 目錄,裡面的檔案預設會原封不動的合併到目的專案中,所以無論如何,這裡面的檔案,都是不能被排除的。

原則上來說, .npmignore 的內容格式與 .gitignore 完全一致,應該不會太難理解才對。我從發現這個問題後,就做出了幾種不同的嘗試,但是都是不對的,感覺頗地雷,各位要小心!

首先,先教大家怎樣在 npm 發行之前,如何才能預先知道有哪些套件會上傳到 npm registry 之中。這個命令,就是:

npm pack

這個命令執行完後,預設就會將所有要發行的檔案,打包成 {name}-{version}.tgz 的壓縮檔,你從壓縮檔案中,就可以得知會發布哪些檔案,不需要等 npm publish 之後才進行測試。

以下我列出幾個錯誤的嘗試:

  1. 嘗試將 /src/env/files/ 目錄排除在忽略清單外,避免 /src/env/files/ 目錄下的 *.ts 檔被排除掉了!( 失敗 )

    *.ts
    !*.d.ts
    !/src/env/files/
  2. 由於設定完全無效,所以調整一下 /src/env/files/ 的順序到第一順位,但依然無效!( 失敗 )

    !/src/env/files/
    *.ts
    !*.d.ts

到最後,我終於理解到一件官網文件沒有寫的細節。那就是 如果你將特定檔案類型加入到忽略清單裝,如果要透過 ! 再把檔案加回來,那就必須要寫成針對定檔案進行描述,不能直接透過「特定目錄」進行設定

最後,正確的寫法如下:

*.ts
!*.d.ts
!src/*/files/**/*

寫成這樣也可以:

*.ts
!*.d.ts
!src/**/files/**/*

是不是很雷!真的遇到了才會知道啊!

相關連結


以上所述就是小编给大家介绍的《發行 Angular Schematics 程式產生器與設定 .npmignore 的注意事項》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

媒介融合

媒介融合

[丹]延森 / 刘君 / 复旦大学出版社 / 2012-9 / 32.00元

“媒介融合”是什么,如何来认识,本书提供的视角令人赞叹。 作为丹麦知名教授,延森具有欧陆学者的气质:思辨、批判。在延森看来,媒介融合带来了研究上的转向——从作为技术的媒介转向作为实践的传播,后者的一个中心命题是 特定的媒介与传播实践将对社会组织(从微观到宏观)产生何种影响? 解决上述问题,首先需要解决交流与传播观念的理论规范问题,本书就是阶段性的成果:基于对交流/传播观念史的考察,建构......一起来看看 《媒介融合》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具