Yargs 是一個很好的命令行程序庫,簡單地說,它可讓建立一個在控制檯中運行的應用程序的過程變得垂手可得。還有什麼能讓它變得更好呢?它是以海盜爲主題的(它的名字叫 YARgs),讓它正式成爲有史以來最好的工具。javascript
你可能知道其餘的 CLI,好比 vue-cli,能夠輕鬆設置一個 Vue.js 項目或 create-react-app,因此這個概念對大多數人來講應該很熟悉。vue
mkdir yargs_practice
cd yargs_practice
touch yargs.js
複製代碼
初始化項目, 並安裝 yargs
java
npm init -y
npm i yargs
複製代碼
package.json
以下所示:node
{
"name": "yargs_practice",
"version": "1.0.0",
"description": "",
"main": "yargs.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"yargs": "^15.3.1"
}
}
複製代碼
使用 vscode 打開當前目錄react
code .
複製代碼
編輯 yargs.js
git
const yargs = require("yargs");
const argv = yargs.argv;
console.log(argv);
複製代碼
在終端中運行github
node yargs.js add --new thing --old="stuff"
複製代碼
獲得以下結果vue-cli
yard 能夠很方便的拿到命令行參數npm
繼續修改 yargs.js
json
const yargs = require("yargs");
const argv = yargs
.command("add", "Add a new note")
.command("list", "List all notes")
.help().argv;
複製代碼
command
能夠增長命令行信息help
方法能夠顯示幫助信息在終端中運行
node yargs.js --help
複製代碼
顯示以下信息
yargs
提供了快捷命令方法(alias)讓一些命令更簡潔
繼續修改 yargs.js
const yargs = require("yargs");
const argv = yargs
.command("add", "Add a new note")
.command("list", "List all notes")
.help()
.alias("help", "h").argv;
複製代碼
在終端中運行
node yargs.js -h
複製代碼
會獲得和--help
同樣的結果
TODO:: option 沒看明白
const yargs = require("yargs");
const argv = yargs
.command("add", "Add a new note")
.command("list", "List all notes")
.help()
.alias("help", "h").argv;
複製代碼
yargs
還支持子命令 用法以下
const yargs = require("yargs");
const argv = yargs
.command("add", "Add a new note", {
title: {
describe: "Title of note",
alias: "t",
demandOption: true,
},
body: {
describe: "Body of note",
alias: "b",
demandOption: true,
},
})
.command("list", "List all notes")
.help()
.option("find")
.alias("help", "h").argv;
複製代碼
在 add
這個命令增長了子命令 title
describe
是這條命令的描述alias
是這條命令的簡寫demandOption
表示 title
必須傳遞參數當咱們在終端中執行
node yargs.js add -h
複製代碼
注意這裏有別於 node yargs.js -h
這裏展現的是 add
這條命令的具體幫助信息
咱們經過一個小的實例來看 yargs 如何使用
咱們須要對這個package.json
文件作一些調整,由於咱們要建立一個 CLI。如今看起來應該是這樣的。
{
"name": "yargs_practice",
"version": "1.0.0",
"description": "",
"main": "yargs.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"bin": {
"line-count": "./line-count"
},
"keywords": ["cli"],
"preferGlobal": true,
"author": "",
"license": "ISC",
"dependencies": {
"yargs": "^15.3.1"
}
}
複製代碼
如下是須要注意的重要改動。
咱們添加了一個 bin 值,它將咱們稍後建立的條目文件映射到它的可執行文件名上(你能夠設置爲任何你想要的名字 咱們已經將 preferGlobal 設置爲 true,這意味着咱們的軟件包但願被全局安裝(例如經過 npm install -g)。 其餘的調整包括改變描述、刪除已使用的腳本、添加做者名稱等。
Yargs 讓解析命令行參數變得很是簡單,不少例子項目能夠在這裏找到。
咱們將建立一個基本的 CLI,它能夠接收一個文件做爲參數並計算它的行數。
要作到這一點,首先建立一個主腳本文件。
touch line-count
複製代碼
編輯這個文件
#!/usr/bin/env node
const argv = require("yargs")
.usage("Usage: $0 <command> [options]")
.help("h")
.alias("h", "help").argv;
複製代碼
讓咱們把全部的代碼逐條逐句的說說。
#!/usr/bin/env node
是一個 shebang 行的實例,它告訴咱們的系統用什麼解釋器來執行該文件.usage('Usage: $0 <command> [options]')
設置當調用 --help 命令時將顯示的 CLI 的用法信息。.help('h')
將幫助命令綁定到選項 h
上。.alias('h', 'help')
爲選項 -h
建立了一個別名,即 --help
。與你所見,這第一步是很是簡單的,yargs 的語法很直觀。
接下來咱們要添加count
命令。
只需在你已有的 CLI 中添加如下幾行。
.command("count", "Count the lines in a file")
.example("$0 count -f foo.js",
"count the lines in the given file")
複製代碼
逐行看看:
.command("count", "count the lines in a file")
建立了一個新的命令,名稱爲 count,並設置了一個描述。
.example("$0 count -f foo.js", "count the lines in the given file")
建立一個帶有描述的例子,當用戶調用 --help 選項或者當他們忘記這個命令時,它將顯示出來。
這些都很好,但如今運行node line-count
計數並無什麼做用,接下來咱們須要一個文件名,經過計數並顯示其行數來完成 CLI。
添加以下信息
.alias("f", "file")
.nargs("f", 1)
.describe("f", "Load a file")
.demandOption(["f"])
複製代碼
line-count
最後應該是這樣的樣子。
#!/usr/bin/env node
const argv = require("yargs")
.usage("Usage: $0 <command> [options]")
.command("count", "Count the lines in a file")
.example("$0 count -f foo.js", "count the lines in the given file")
.alias("f", "file")
.nargs("f", 1)
.describe("f", "Load a file")
.demandOption(["f"])
.help("h")
.alias("h", "help").argv;
複製代碼
逐行,解釋下新添加的代碼
.alias("f", "file")
爲-f 選項建立別名 --file。
.nargs("f", 1)
爲該選項設置一個參數(文件名),不然顯示 --help 菜單。
.description("f", "Load a file")
爲該選項添加一個描述。
.demandOption([["f"])
,由於咱們須要一個文件名,因此咱們要求選項-f。
最後,讓咱們把程序的邏輯加上。
// Create stream with the file
const s = fs.createReadStream(argv.file);
var lines = 0;
s.on("data", (buf) => {
// Get the number of lines
lines += buf.toString().match(/\n/g).length;
});
s.on("end", () => {
// Display the number of lines
console.log(lines);
});
複製代碼
就這樣,咱們來試試。
到如今爲止,咱們的程序一直是這樣運行的,但若是直接調用它,就會報錯。
咱們能夠經過使用 npm link
命令將二進制文件(咱們以前在 package.json 中定義爲 bin)進行全局註冊來解決這個問題。
在當前目錄下執行
npm link
複製代碼
恭喜 🎉,你如今能夠像這樣在本地運行你的腳本了。
line-count count -f package.json
複製代碼
在部署以前,咱們須要在 package.json
中添加一些信息。
"homepage": "YOUR GITHUB REPO OR SITE HERE",
"repository": {
"type": "git",
"url": "git+YOUR GITHUB REPOSITORY HERE"
},
"engines": {
"node": ">=8"
},
複製代碼
nodejs
版本號,簡單地定義了你的項目應該在最小版本的節點上工做。 版本號取決於你用了那些版本的特性。下面是接下來的步驟。
npmjs.com
上建立一個帳戶(可選,若是有能夠忽略)npm login
命令並輸入你的信息npm publish
命令,它將在幾分鐘內自動發佈。就是這樣! 若是你想在未來更新你的項目,你須要在 package.json
文件中修改它的版本號,而後再次運行發佈命令。