如何使用 yargs

什麼是 Yargs

Yargs

Yargs 是一個很好的命令行程序庫,簡單地說,它可讓建立一個在控制檯中運行的應用程序的過程變得垂手可得。還有什麼能讓它變得更好呢?它是以海盜爲主題的(它的名字叫 YARgs),讓它正式成爲有史以來最好的工具。javascript

你可能知道其餘的 CLI,好比 vue-cli,能夠輕鬆設置一個 Vue.js 項目或 create-react-app,因此這個概念對大多數人來講應該很熟悉。vue

開始

mkdir yargs_practice
cd yargs_practice
touch yargs.js
複製代碼

初始化項目, 並安裝 yargsjava

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.jsgit

const yargs = require("yargs");
const argv = yargs.argv;
console.log(argv);
複製代碼

在終端中運行github

node yargs.js add --new thing --old="stuff"
複製代碼

獲得以下結果vue-cli

yargs

yard 能夠很方便的拿到命令行參數npm

繼續修改 yargs.jsjson

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

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;
複製代碼

option

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
複製代碼

yargs

注意這裏有別於 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)。 其餘的調整包括改變描述、刪除已使用的腳本、添加做者名稱等。

建立一個基本的 CLI

Yargs 讓解析命令行參數變得很是簡單,不少例子項目能夠在這裏找到。

咱們將建立一個基本的 CLI,它能夠接收一個文件做爲參數並計算它的行數。

要作到這一點,首先建立一個主腳本文件。

touch line-count
複製代碼

編輯這個文件

#!/usr/bin/env node
const argv = require("yargs")
  .usage("Usage: $0 <command> [options]")
  .help("h")
  .alias("h", "help").argv;
複製代碼

讓咱們把全部的代碼逐條逐句的說說。

  1. #!/usr/bin/env node 是一個 shebang 行的實例,它告訴咱們的系統用什麼解釋器來執行該文件
  2. .usage('Usage: $0 <command> [options]')設置當調用 --help 命令時將顯示的 CLI 的用法信息。
  3. .help('h') 將幫助命令綁定到選項 h 上。
  4. .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")
複製代碼

逐行看看:

  1. .command("count", "count the lines in a file") 建立了一個新的命令,名稱爲 count,並設置了一個描述。

  2. .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;
複製代碼

逐行,解釋下新添加的代碼

  1. .alias("f", "file") 爲-f 選項建立別名 --file。

  2. .nargs("f", 1) 爲該選項設置一個參數(文件名),不然顯示 --help 菜單。

  3. .description("f", "Load a file")爲該選項添加一個描述。

  4. .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);
});
複製代碼

就這樣,咱們來試試。

createReadStream

到如今爲止,咱們的程序一直是這樣運行的,但若是直接調用它,就會報錯。

line-count

咱們能夠經過使用 npm link 命令將二進制文件(咱們以前在 package.json 中定義爲 bin)進行全局註冊來解決這個問題。

在當前目錄下執行

npm link
複製代碼

恭喜 🎉,你如今能夠像這樣在本地運行你的腳本了。

line-count count -f package.json
複製代碼

line-count

發佈 CLI 到 NPM

在部署以前,咱們須要在 package.json 中添加一些信息。

"homepage": "YOUR GITHUB REPO OR SITE HERE",
"repository": {
  "type": "git",
  "url": "git+YOUR GITHUB REPOSITORY HERE"
},
"engines": {
  "node": ">=8"
},
複製代碼
  • homepage 和 repository 要填寫你本身的 GitHub 項目地址
  • engines 確認 nodejs 版本號,簡單地定義了你的項目應該在最小版本的節點上工做。 版本號取決於你用了那些版本的特性。

下面是接下來的步驟。

  • npmjs.com 上建立一個帳戶(可選,若是有能夠忽略)
  • 運行 npm login 命令並輸入你的信息
  • 運行 npm publish 命令,它將在幾分鐘內自動發佈。

就是這樣! 若是你想在未來更新你的項目,你須要在 package.json 文件中修改它的版本號,而後再次運行發佈命令。

參考

  1. Building a CLI with Yargs
  2. How to use Yargs
相關文章
相關標籤/搜索