yarn tips, 그냥 node 명령과 npm, yarn 명령 차이

일반 터미널에서 실행이 안 되는 명령어가 있다
글로벌로 설치되지 않았는데, 왜 package.json의 script에 들어 있는 cli 도구들이 동작하는 걸까?

package.json script vs 일반 터미널의 명령

package.json
1
2
3
4
5
6
7
{
// ...
"scripts": {
"build": "tsc --init"
}
// ...
}
  • package.json에 tsc --init을 실행하는 build 스크립트가 있다고 하자
terminal
1
2
3
4
5
6
7
### without script
tsc --init

### with script
npm run build
# or
yarn build
  • 그냥 tsc --init 명령을 실행했을 때

    • 타입스크립트가 전역 설치되어 있지 않으면 실행되지 않는다
    • 전역 설치되어있다면 전역으로 설치된 타입스크립트 컴파일러(tsc)가 실행된다
  • npm 또는 yarn을 통해 실행했을 때

    • 현재 워크스페이스에 설치된 tsc가 실행된다
    • 현재 워크스페이스에 타입스크립트가 설치되어 있지 않으면 전역으로 설치된 tsc가 실행된다
    • 전역 설치되어있지 않으면 실행되지 않는다
  • 전역으로 설치된 명령과 package.json script를 통해 실행되는 cli 도구가 다르다

  • script를 통해 실행하면 워크스페이스에 설치된 도구를 우선적으로 사용하는 것을 알 수 있다

  • 그러면 이 도구들은 어디 존재하는 걸까?

위치

package.json script

  • node_modules/.bin

전역 패키지

  • %appdata%/npm

yarn 꿀팁?

  • 위에서 확인한 것처럼 node_modules/.bin에서 사용 가능한 cli도구를 확인할 수 있다
  • 이 도구들을 꼭 script에 작성해야지만 사용 가능한 것은 아니다
  • package.json에 스크립트를 작성하지 않고도, 현재 워크스페이스에 설치된 cli 도구들을 사용할 수 있다
terminal
1
yarn tsc --init
  • 이렇게 yarn으로 시작하는 경우 script에 작성한 것과 동일한 효과를 가져올 수 있다
  • 한 번만 명령어를 쓰는 경우 스크립트에 등록하지 않고 쉽게 실행시켜 볼 수있다

더 알아보기

  • yarn node index.jsnode index.js를 비교해보자
index.js
1
2
// console.log(process.env);
console.log(process.env.path);
  • yarn or npm run 으로 실행하는 것과 그냥 node로 실행하는 것이 다른데, 환경 변수가 다르다
  • yarn or npm run 으로 실행하면 훨씬 더 많은 환경을 가지는 것을 확인할 수 있고,
  • 특히 path를 확인해보면 yarn, npm 을 통해 실행한 경우 path에 node_modules/.bin 경로가 들어있는 것을 확인할 수 있다

commander.js로 cli 도구 만들기

  • 간단한 cli 도구를 만들어보았다

TMI

cli.ts

cli.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env node
import { Command } from 'commander';
import { gto9 } from 'g-to-9';
import { version } from './package.json';

const program = new Command();

program.version(version);

program
.argument('<text>')
.description(
`replace all 'g' to '9'

Examples:
$ gto9 chinsung
$ gto9 gg is good game
$ gto9 'gg is good game'`
)
.action(() => {
const input = program.args.join(' ');
const result = gto9(input);
console.log(result);
});

program.parse();
  • #!/usr/bin/env node 최상단에 추가해줘야 한다

Windows Script Host
Microsoft JScript 컴파일 오류

  • 추가하지 않으면 만나는 오류이다

package.json

package.json
1
2
3
4
5
6
7
8
9
10
{
"name": "g-to-9-cli",
"version": "1.0.0",
"description": "g-to-9-cli",
"main": "cli.js",
"bin": {
"gto9": "cli.js"
}
// ...
}
  • package.json 에서 bin 필드에 값을 넣어주어 쉽게 cli 설정을 할 수 있다
  • 오브젝트를 넣어주거나 스트링을 넣어줄 수 있는데,
  • 스트링을 넣는 경우 "{cli path}" 형태로 한다. 이경우에는 프로젝트 이름으로 실행할 수 있다
  • 오브젝트의 경우 {"{command}" : "{cli path}"} 형태로 넣어준다. 이경우에는 프로젝트 이름과 다른 커맨드를 지정해 줄 수 있다
  • 참고 ; https://docs.npmjs.com/cli/v7/configuring-npm/package-json#bin

참고

리눅스에서 파일, 폴더 삭제 명령

1
2
3
4
5
rm -rf {디렉터리명}
rm -rf {파일명}
rm -rf {파일명} {디렉터리명} {이렇게 계속 나열하기}

rm -rf node_modules package-lock.json
  • cli로 삭제할 파일 또는 디렉터리를 하나이상 나열하여 한번에 삭제할 수 있다

shell script 실행하기

terminal
1
2
3
sh my_script.sh

./my_script.sh

shell script 경로에서 실행

bash
1
2
3
dirpath=`dirname $0`
echo $dirpath
cd $dirpath
  • 셸 스크립트 파일 경로로부터 명령을 실행할 수 있다

npm 명령어

내가 쓰는 명령어

1
2
3
4
5
6
7
8
9
10
npm i
npm i [패키지명]
npm i [패키지명] -D
npm i [패키지명] -g

npm start
npm run [script]

npm repo ; package.json에 있는 레포주소를 브라우저로 연다
npm version ; 버전업 명령어
  • 이렇게를 주로 쓴다
  • npm install aliases: npm i, npm add

짧게 쓰는 npm 명령어

  • npm i == npm install
  • npm i -D == npm i --save-dev
  • npm i -g == npm i --global

npm install option

  • -D ; 개발할때만 쓰이는 패키지를 설치할때 사용한다. 배포할때 포함되지 않는다
  • -g ; 패키지 전역 설치. hexo같은 cli에 바로 명령어를 치는 놈들을 보통 이렇게 설치한다

참고

  • npm i [패키지명] -S 이렇게 --save옵션을 줘야만 package.json에 들어갔는데, npm5부터 기본값이라 안적어도 된다

npm scripts

package.json
1
2
3
4
5
6
7
8
9
10
11
{
// ...
"scripts": {
"build": "hexo generate",
"clean": "hexo clean",
"deploy": "hexo deploy",
"test": "hexo server",
"start": "hexo generate & hexo deploy & git add . & git commit -m "
}
// ...
}
  • 여기에 명령을 등록시켜놓고 npm run build 이런식으로 사용한다
  • 여기서 test, start 스크립트는 run을 생략하여 npm start, npm test 이런식으로 사용할 수 있다
  • 그 외에 stop, restart 를 run 없이 바로 사용할 수 있다

참고