腳手架入口文件開發
-
創建腳手架項目: abc-cli
- $
mkdir abc-cli && cd abc-cli
- $
-
全局安裝 lerna, $
npm i -g lerna
-
基于 lerna 完成項目初始化
- $
lerna init
- $
-
基于 lerna 創建腳手架 cli
- $
lerna create cli
- 一路回車
- $
-
好現在生成了一個 cli 的模板,目前需要修改它
-
新建 abc-cli/packages/cli/bin/cli.js
#!/usr/bin/env nodeconsole.log(1)
-
到 abc-cli/packages/cli/package.json 中修改
"name": "@abc.com/cli"
目前假設我們的組織是 abc.com"main": "lib/index.js"
入口文件修改名稱"bin": { "abc-cli": "bin/cli.js" }
添加 bin 配置"files": [ "lib", "bin" ]
在 files 中添加 bin
-
在 abc-cli/packages/cli 中執行 $
npm link
- 這樣,驗證執行 $
abc-cli
沒有報錯, 正常輸出1,就行
- 這樣,驗證執行 $
-
現在為cli包添加依賴, 在頂層 abc-cli 目錄下執行
- $
npm i import-local npmlog -w @abc.com/cli
- $
-
新建文件 abc-cli/packages/cli/lib/index.js
module.exports = (args) => {console.log('args: ', args); }
-
修改 abc-cli/packages/cli/bin/cli.js
#!/usr/bin/env nodeconst il = require('import-local'); const log = require('npmlog'); const entry = require('../lib/index.js');// 判斷 __filename 是否可以加載到本地的版本 if (il(__filename)) {log.info('abc-cli', '使用本地版本'); // 這里不會走 } else {entry(process.argv.slice(2)); // 會執行這里 }
-
因為之前在 cli 包內執行了 npm link, 所以,這里一定會走 else
-
驗證,執行 $
abc-cli 123
, 終端輸出如下$ abc-cli 123 args: [ '123' ]
-
注意,這里 import-local 包
- 它的主要作用是導入本地包,以避免全局npm包和本地項目中的包產生沖突
- 當全局node_modules和本地node_modules中存在相同的庫時,import-local會優先加載本地node_modules中的庫
- 這樣可以確保項目中使用的是本地安裝的、可能經過定制的庫版本,而不是全局安裝的版本
- 這對于管理項目依賴和避免版本沖突非常有用
-
此時,我們通用腳手架框架的入口文件開發完畢了