0 부터 개인 전용 명령 행 도구 모음 만 들 기-yargs 완전 가이드

머리말
명령 행 프로그램 을 사용 하 는 것 은 프로그래머 에 게 흔 하 다.전단 엔지니어 나 gui 를 개발 하 더 라 도 명령 행 을 사용 하여 프로그램 이나 포장 프로그램 을 컴 파일 해 야 한다.
명령 행 도 구 를 능숙 하 게 사용 하면 개발 효율 을 크게 향상 시 킬 수 있 습 니 다.Liux 가 가지 고 있 는 명령 행 도 구 는 모두 매우 유용 합 니 다.그러나 이런 도 구 는 모두 일반적인 수요 에 따라 개 발 된 것 입 니 다.특별한 수요 가 있 으 면 스스로 스 크 립 트 를 써 서 이름 을 대량으로 바 꾸 고 파일 내용 을 대량으로 바 꾸 는 등 작업 효율 을 제공 해 야 합 니 다.
node.js 가 나 오기 전에 python 은 스 크 립 트 를 개발 하여 특수 한 임 무 를 수행 하 는 데 자주 사용 되 었 습 니 다.예 를 들 어 python 파충류,python 과 관련 된 튜 토리 얼 이 많 고 관심 이 있 는 자신 구 글 입 니 다.
node.js 의 비동기 io 특성 덕분에 node 개발 io 밀집 류 임 무 는 매우 간단 해 졌 습 니 다.이 글 은 node.js 의 yargs 모듈 을 어떻게 사용 하여 자신의 명령 행 도구 집합 을 개발 하 는 지 알려 드 립 니 다.
명령 행 매개 변수 분석
yargs 는 npm 모듈 에서 명령 행 매개 변수 분석 을 완성 하 는 데 사 용 됩 니 다.셸 을 사용 하여 명령 행 을 개발 하 는 시대 로 돌아 갑 니 다.getopts 는 1 세대 명령 행 매개 변수 분석 도구 입 니 다.shell => python => node.js의 교 체 를 거 쳐 명령 행 매개 변수 분석 프로그램 은 크게 진화 되 지 않 았 습 니 다.그들의 항목 은 항상 사용자 가 명령 행 에서 들 어 오 는 매개 변 수 를 지정 한 형식 으로 해석 하여 프로그램 이 사용 할 수 있 도록 합 니 다.
큰 변 화 는 없 지만 명령 행 매개 변수 분석 모듈 을 개발 하 는 것 이 간단 하기 때문에 현재 node 커 뮤 니 티 에는 yargs 와 유사 한 오픈 소스 프로젝트 가 많이 존재 합 니 다.여기 서 간단하게 열거 하고 관심 있 는 것 은 스스로 알 아 보고 자신 이 좋아 하 는 항목 을 선택 하여 사용 할 수 있 습 니 다.
  • minimist 원천
  • optimist python 의 optimist 프로젝트 모방
  • commander.js tj 는 node.js 대신,co 의 저자,commander.js 는 ruby 의 commander 프로젝트 에서 유래 했 고 작가 도 tj
  • nopt npm 프로젝트 에서 사용
  • nomnomnom 는 더 이상 유지 하지 않 고 사용 을 권장 하지 않 습 니 다
  • yargs
    완 일 봉 의 Node.js 명령 행 프로그램 개발 튜 토리 얼 을 읽 은 후 Yrgs 를 사용 하여 자신의 명령 행 도 구 를 개발 하기 시 작 했 습 니 다.시간 이 지나 면 매우 좋 은 것 을 알 게 되 었 습 니 다.
    완 대신 의 글 이 발 표 된 이래 yargs 는 약간의 변경 이 있 었 고 많은 유용 한 기능 을 추가 했다.특히.commandDir(directory, [opts])이 기능 은 명령 행 도구 집합 을 만 드 는 데 매우 유용 하기 때문에 새로운 버 전의 yargs 튜 토리 얼 을 쓰 는 것 이 필요 하 다.
    yargs 의 용법 은 비교적 간단 한 편 입 니 다.영어 에 자신 이 있 는 사람 은 첫 페이지 에서 원판 을 읽 을 수 있 습 니 다:yargs
    단순 모드
    yargs 는 기본적으로 두 개--를 매개 변수 접두사 로 사용 하고 중간 에 빈 칸 이나=을 사용 할 수 있 습 니 다.
    아래 코드 는 yargs 의 가장 간단 한 용법 을 보 여 줍 니 다.yargs 만 도입 하면 명령 행 인 자 를 읽 을 수 있 습 니 다.어떠한 설정 도 쓸 필요 가 없습니다.매우 간단 합 니 다.
    #!/usr/bin/env node
    var argv = require('yargs').argv;
    
    if (argv.ships > 3 && argv.distance < 53.5) {
        console.log('Plunder more riffiwobbles!');
    } else {
        console.log('Retreat from the xupptumblers!');
    }
    $ ./plunder.js --ships=4 --distance=22
    Plunder more riffiwobbles!
    
    $ ./plunder.js --ships 12 --distance 98.7
    Retreat from the xupptumblers!

    예제 코드 는 모두 홈 페이지 에서 왔 습 니 다:yargs
    간단 한 모드 에서 짧 은 변 수 를 읽 을 수 있 습 니 다.예 를 들 어-x 4argv.x = 4에 해당 합 니 다.
    간단 한 모드 에서 불 형식 을 읽 을 수 있 습 니 다-sargv.s = true에 해당 합 니 다.
    간단 한 모드 에 서 는 비-시 작 된 변 수 를 읽 을 수 있 습 니 다.이러한 유형의 변 수 는argv._배열 에 저 장 됩 니 다.
    매개 변수 설정
    간단 한 모드 의 기능 은 모두 한 줄 의 코드 로 만 실현 할 수 있다.
    var argv = require('yargs').argv;

    그러나 변수 가 나타 나 는 횟수 를 통계 하려 면 어떻게 합 니까?정 답 은 매개 변수 설정 옵션 을 추가 하 는 것 입 니 다.
    #!/usr/bin/env node
    var argv = require('yargs')
        .count('verbose')
        .alias('v', 'verbose')
        .argv;
    
    VERBOSE_LEVEL = argv.verbose;
    
    function WARN()  { VERBOSE_LEVEL >= 0 && console.log.apply(console, arguments); }
    function INFO()  { VERBOSE_LEVEL >= 1 && console.log.apply(console, arguments); }
    function DEBUG() { VERBOSE_LEVEL >= 2 && console.log.apply(console, arguments); }
    
    WARN("Showing only important stuff");
    INFO("Showing semi-important stuff too");
    DEBUG("Extra chatty mode");

    위의 프로그램 은verbose매개 변수 가 나타 난 횟수 를 통계 할 수 있 고 줄 임 말-v도 통계 할 수 있 으 며 구체 적 인 호출 예 는 아래 의 코드 를 참고 한다.
    $ node count.js
    Showing only important stuff
    
    $ node count.js -v
    Showing only important stuff
    Showing semi-important stuff too
    
    $ node count.js -vv
    Showing only important stuff
    Showing semi-important stuff too
    Extra chatty mode
    
    $ node count.js -v --verbose
    Showing only important stuff
    Showing semi-important stuff too
    Extra chatty mode

    yargs 는 명령 행 프로그램 을 보완 하 는 데 많은 인 터 페 이 스 를 제공 합 니 다.
    제시 용법
    var argv = require('yargs')
        .usage('Usage: $0 -w [num] -h [num]')
        .argv;

    필수 매개 변수
    #!/usr/bin/env node
    var argv = require('yargs')
        .usage('Usage: $0 -w [num] -h [num]')
        .demand(['w','h'])
        .argv;

    매개 변수 기본 값 제공
    #!/usr/bin/env node
    var argv = require('yargs')
        .default('x', 10)
        .default('y', 10)
        .argv
    ;
    console.log(argv.x + argv.y);

    도움말 정보 인쇄
    #!/usr/bin/env node
    var argv = require('yargs')
        .usage('Usage: $0  [options]')
        .help('h')
        .alias('h', 'help')
        .epilog('copyright 2015')
        .argv;

    별명 사용
    var argv = require('yargs')
        .usage('Usage: $0  [options]')
        .alias('h', 'help')
        .argv;

    방문argv.h은 방문argv.help에 해당 합 니 다.
    매개 변수 배열
    var argv = require('yargs')
        .usage('Usage: $0  [options]')
        .alias('n', 'name')
        .array('n')
        .argv;
    
    console.log(argv.n);

    호출
    node array_test.js -n abc test

    매개 변수 범위 설정
    var argv = require('yargs')
      .alias('i', 'ingredient')
      .describe('i', 'choose your sandwich ingredients')
      .choices('i', ['peanut-butter', 'jelly', 'banana', 'pickles'])
      .help('help')
      .argv

    상기 코드 설정argv.i의 값 은['peanut-butter', 'jelly', 'banana', 'pickles']배열 중의 하나 일 수 있 습 니 다.
    위 는 yargs 의 비교적 간단 한 용법 입 니 다.전체 판 을 읽 으 려 면 github 에서 읽 는 것 을 권장 합 니 다.
    하위 명령
    yargs 가 복잡 한 명령 행 프로그램 을 개발 하기에 적합 한 또 다른 이 유 는 하위 명령 을 지원 하고 하위 명령 을 끼 워 넣 을 수 있 기 때 문 입 니 다.이것 은 git 와 같은 수백 개의 명령 을 가 진 프로그램 을 열 수 있다 는 것 을 의미 합 니 다.
    yargs 의 하위 명령 은 두 가지 모드 가 있 습 니 다..command(*).commandDir(directory, [opts]).command .command방법 은 세 개의 인터페이스 가 있다.
    .command(cmd, desc, [builder], [handler])
    
    .command(cmd, desc, [module])
    
    .command(module)

    사실 이들 의 용법 은 차이 가 많 지 않 습 니 다.이 모듈 은 모두 하나의 모듈 을 yargs 에 전달 하 는 것 으로 볼 수 있 습 니 다.이 모듈 은 네 개의 변 수 를 내 보 내야 합 니 다cmd, desc [builder], [handler].그 중에서 builder 와 handler 는 방법 이 고 다른 두 개 는 문자열 입 니 다.
    첫 번 째 인 터 페 이 스 를 사용 하 는 예제
    yargs
      .command(
        'get',
        'make a get HTTP request',
        function (yargs) {
          return yargs.option('u', {
            alias: 'url',
            describe: 'the URL to make an HTTP request to'
          })
        },
        function (argv) {
          console.log(argv.url)
        }
      )
      .help()
      .argv

    세 번 째 인 터 페 이 스 를 사용 하려 면 이 모듈 을 단독 파일 에 두 고 require 로 도입 해 야 합 니 다.
    모듈 코드 입 니 다.
    // my-module.js
    exports.command = 'get  [proxy]'
    
    exports.describe = 'make a get HTTP request'
    
    exports.builder = {
      banana: {
        default: 'cool'
      },
      batman: {
        default: 'sad'
      }
    }
    
    exports.handler = function (argv) {
      // do something with argv.
    }

    도입 할 때 이렇게 사용 해 요.
    yargs.command(require('my-module'))
      .help()
      .argv

    추가 모듈 이 cmd 와 desc 를 정의 하지 않 았 을 때 두 번 째 인 터 페 이 스 를 사용 할 수 있 습 니 다.
    yargs.command('get  [proxy]', 'make a get HTTP request', require('my-module'))
      .help()
      .argv

    여기 서 세 번 째 인 터 페 이 스 를 사용 하 는 것 을 권장 합 니 다.이렇게 하면 모듈 의 내부 집적 을 유지 할 수 있 습 니 다.이 모듈 은 어떤 명령 아래 에 마 운 트 할 수 있 습 니 다.이동 할 때 모듈 코드 를 수정 하지 않 고 모듈 을 도입 하 는 코드 만 수정 하면 실 현 될 수 있 습 니 다.
    .commandDir
    만약 에 대량의 명령 이 위의.command(module)를 사용 하여 개발 된다 면 이 모듈 들 은 모두 같은 구 조 를 가지 고 있 기 때문에 이 명령 의 도입 과정 을 간소화 하고 이 과정 을 자동화 할 수 있 는 방법 이 있 을 것 이다.이 를 바탕 으로 yargs 는.commandDir인 터 페 이 스 를 제공 했다.
    다음은 제 가 쓴 프로젝트 pit 를 참고 하 겠 습 니 다.
    다음은 이 항목 의 디 렉 터 리 구조 입 니 다.
    .
    ├── pit
    │   ├── douban
    │   │   └── movie.js
    │   ├── douban.js
    │   ├── gg
    │   │   ├── client.js
    │   │   ├── login.js
    │   │   ├── scope.js
    │   │   ├── scope.json
    │   │   ├── secret.json
    │   │   ├── token.json
    │   │   └── upload.js
    │   ├── gg.js
    │   ├── git
    │   │   ├── commit.js
    │   │   ├── create.js
    │   │   ├── deploy.js
    │   │   ├── push.js
    │   │   └── token.json
    │   ├── git.js
    │   ├── gm.js
    │   ├── md5.js
    │   ├── news
    │   │   ├── bing.js
    │   │   ├── funs.js
    │   │   ├── funs.json
    │   │   ├── games.js
    │   │   ├── games.json
    │   │   ├── google.js
    │   │   ├── newsall.json
    │   │   ├── shops.js
    │   │   ├── shops.json
    │   │   ├── videos.js
    │   │   └── videos.json
    │   └── news.js
    └── pit.js
    

    pit.js:명령 행 입구
    #!/usr/bin/env node
    
    require('yargs')
      .commandDir('pit')
      .demand(1)
      .help()
      .locale('en')
      .showHelpOnFail(true, 'Specify --help for available options')
      .argv

    이 코드 는 같은 디 렉 터 리 의 같은 이름 의 폴 더pit를 읽 는 명령 만 하위 명령 으로 불 러 옵 니 다.
    메모:commandDir 기본 값 은 디 렉 터 리 의 다음 단계 파일 만 불 러 옵 니 다.다시 불 러 오 려 면 이렇게 써 야 합 니 다.commandDir('pit', {recurse: true})이 어 git 하위 명령 을 살 펴 보 겠 습 니 다.git 프로젝트 는 제출 할 때마다 같은 절 차 를 반복 하기 때문에 더 간단 한 명령 을 개발 하여 포장 제출 하려 고 합 니 다.
    git.js
    
    exports.command = 'git ';
    
    exports.desc = 'github command list';
    
    exports.builder = function (yargs) {
      return yargs.commandDir('git')
    }
    
    exports.handler = function (argv) {}
    

    git 도 디 렉 터 리 를 자신의 하위 명령 으로 불 러 옵 니 다:commt 를 예 로 들 면
    commit.js
    'use strict';
    
    var fs = require('fs');
    var path = require('path');
    
    require('shelljs/global');
    
    var Q = require('q');
    
    function _exec(cmd) {
      var deferred = Q.defer();
      exec(cmd, function (code, stdout, stderr) {
        deferred.resolve();
      });
      return deferred.promise;
    }
    
    exports.command = 'commit';
    
    exports.desc = 'commit repo local';
    
    exports.builder = function (yargs) {
      return yargs
        .help('h');
    };
    
    exports.handler = function (argv) {
      var repo = process.cwd();
      var name = path.basename(repo);
      Q.fcall(function () { })
        .then(() => _exec(`git add .`))
        .then(() => _exec(`git commit -m 'd'`))
        .catch(function (err) {
          console.log(err);
        })
        .done(() => {
          console.log(`commit ${repo} done`);
        });
    
    }

    이 명령 은 기본적으로 git 프로젝트 의 루트 디 렉 터 리 에서 실 행 됩 니 다.git 명령 과 달리 git 는 프로젝트 루트 디 렉 터 리 의 임의의 하위 디 렉 터 리 에서 실 행 될 수 있 습 니 다.
    셸 js 를 사용 하여 하위 명령 을 실행 한 다음 Q 로 promise 패 키 징 을 하여 명령 의 실행 순 서 를 확보 하 는 동시에 명령 행 출력 과 오류 정 보 를 제어 에 인쇄 합 니 다.
    시간 을 절약 할 수 있 는 간단 한 명령 행 프로그램
    뻗다
    고 수 는 모두 명령 행 을 잘 사용 합 니 다.(영화 속 의 고수 도 마찬가지 입 니 다)명령 행 을 사용 하여 일상적인 임 무 를 완성 하 는 것 에 습관 이 되면 점점 의존 하 게 됩 니 다.계속 하면 모든 일 을 명령 행 에 사용 하 는 것 을 고려 할 것 입 니 다.물론 이 목적 은 실현 되 지 않 습 니 다.모든 임 무 를 자동 으로 수행 할 수 있 는 명령 행 을 명령 행 이 라 고 부 르 지 않 기 때 문 입 니 다.AI 라 고 부 릅 니 다.
    비록 고 지능 ai 를 개발 할 수 는 없 지만 명령 행 으로 완성 할 수 있 는 임무 가 많 습 니 다.여기 제 생각 을 적어 서 참고 하 시기 바 랍 니 다.
    api 명령 행
    대형 사이트 에 서 는 api 인터페이스 에 oauth 2.0 인증 을 제공 합 니 다.명령 행 을 사용 하여 api 인 터 페 이 스 를 호출 하려 면 충분히 할 수 있 습 니 다.
    aws,google cloud,aliyun 같은 클 라 우 드 호스트 는 명령 행 을 사용 하면 많은 운영 시간 을 절약 할 수 있 습 니 다.
    또한 위 에 pit.js 가 쓴 douban.js 를 참고 하여 두 판 의 데 이 터 를 캡 처 할 수 있 습 니 다.두 판 의 공공 api 는 인증 없 이 방문 할 수 있 습 니 다.테스트 를 하 는 것 이 매우 편리 합 니 다.
    명령 행 파충류
    node.js 를 사용 하여 파충 류 를 개발 하 는 것 은 python 을 사용 하 는 것 처럼 간단 하지만 기능 이 완 비 된 파충 류 는 명령 행 인터페이스 가 없어 서 는 안 됩 니 다.새로운 수요 가 있 을 때마다 코드 를 수정 할 수 는 없습니다.다음 에 제 가 쓴 간단 한 node.js 기반 파충류 프로젝트 를 공유 하 겠 습 니 다.
    양식 제출
    api 인 터 페 이 스 를 제공 하지 않 지만 명령 을 사용 하여 상호작용 을 하고 싶 은 사이트 에 대해 서 는 폼 제출 을 통 해 로그 인 을 한 다음 에 로그 인 을 한 후에 할 수 있 는 일 을 할 수 있 습 니 다.예 를 들 어 글 을 발표 하 는 것 입 니 다.
    현재 많은 사이트 에서 markdown 을 사용 하여 글 을 편집 하고 발표 하 는 것 을 지원 합 니 다.이런 사이트 에 대해 서 는 자신의 명령 행 을 개발 하여 통일 적 으로 관리 할 수 있 습 니 다.글 을 다 쓴 후에 간단 한 명령 만 있 으 면 글 을 동시에 각 사이트 로 보 낼 수 있 습 니 다.
    여러분 의 생각 을 교류 하 는 것 을 환영 합 니 다!
    개인 블 로그 주소:자유 전단

    좋은 웹페이지 즐겨찾기