Cli: [버그]`npm ci`κ°€`postinstall` 슀크립트λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠμŒ

에 λ§Œλ“  2020λ…„ 10μ›” 06일  Β·  8μ½”λ©˜νŠΈ  Β·  좜처: npm/cli

ν˜„μž¬ 행동 :

npm ci 은 postinstall 슀크립트λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ˜ˆμƒλ˜λŠ” λ™μž‘ :

npm ci λŠ” postinstall 슀크립트λ₯Ό μ‹€ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

μž¬ν˜„ 단계 :

  1. μƒˆ 폴더λ₯Ό λ§Œλ“€κ³  κ·Έ μ•ˆμ— λ‹€μŒκ³Ό 같은 μ΅œμ†Œν•œμ˜ package.json을 λ„£μœΌμ‹­μ‹œμ˜€.
{
  "scripts": {
    "postinstall": "echo \"it should echo this\""
  }
}


  1. npm install
  2. npm ci
  3. npm ci κ°€ postinstall 슀크립트λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

ν™˜κ²½:

μ „μ˜.

  • 운영체제 : Kubuntu 20.04
  • λ…Έλ“œ : 14.13.0
  • npm : 7.0.0-rc.0
Bug Release 7.x

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@darcyclarke @isaacs λŠ” 직접 νƒœκ·Έμ— λŒ€ν•΄ μ‚¬κ³Όν•˜μ§€λ§Œ,이 λ¬Έμ œλŠ” μŠ€ν”„λ¦°νŠΈ λ§ˆμΌμŠ€ν†€ 쀑 ν•˜λ‚˜μ—μ„œ 제거 된 κ²ƒμœΌλ‘œ ν™•μΈλ˜μ—ˆμœΌλ―€λ‘œ μƒλ‹Ήνžˆ μ€‘μš”ν•œ νšŒκ·€μ΄λ―€λ‘œ κ°„κ³Όλ˜μ§€ μ•Šμ•˜λŠ”μ§€ ν™•μΈν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μ›λž˜ λ¬Έμ œμ—μ„œ λͺ…ν™•ν•˜μ§€ μ•Šμ€ 경우λ₯Ό λŒ€λΉ„ ν•œ μ΅œμ†Œν•œμ˜ μž¬ν˜„μž…λ‹ˆλ‹€.

{
  "scripts": {
    "prepare": "echo foo"
  }
}

npm@6 λ₯Ό μ‚¬μš©ν•˜λ©΄ npm install 및 npm ci "foo"λ₯Ό μΈμ‡„ν•©λ‹ˆλ‹€. npm@7 ν•˜λ©΄ npm install λŠ” "foo"λ₯Ό μΈμ‡„ν•˜μ§€λ§Œ npm ci λŠ” μΈμ‡„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ¬Έμ œλŠ” install λͺ…령에 μ μ ˆν•œ μ„€μΉ˜ 슀크립트λ₯Ό λͺ…μ‹œ 적으둜 μ‹€ν–‰ν•˜κΈ°μœ„ν•œ λ‹€μŒ 블둝이 μžˆμ§€λ§Œ ci λͺ…λ Ήμ—λŠ” μ΄λŸ¬ν•œ 블둝이 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

https://github.com/npm/cli/blob/a28aff769a77f127f371c31afcb9e9814722e5cd/lib/install.js#L44 -L62

λͺ¨λ“  8 λŒ“κΈ€

λ‚˜λŠ” 이것이 μ˜λ„ ν•œλŒ€λ‘œ μž‘λ™ν•˜κ±°λ‚˜ 적어도 npm v6 와 λ™μΌν•˜λ‹€κ³  μƒκ°ν•˜λ©° λ²„κ·Έμ²˜λŸΌ λ³΄μ΄μ§€λŠ” μ•Šμ§€λ§Œ μ•„λ§ˆλ„ 맀우 ν˜Όλž€ 슀러울 κ²ƒμž…λ‹ˆλ‹€.

preinstall , install 및 postinstall μŠ€ν¬λ¦½νŠΈλŠ” μ‹€μ œλ‘œ νŒ¨ν‚€μ§€ μžμ²΄κ°€ λ‹€λ₯Έ ν”„λ‘œμ νŠΈμ— μ„€μΉ˜λ˜κ±°λ‚˜ μ’…μ†μ„±μœΌλ‘œ μ„€μΉ˜ 될 λ•Œ νŠΈλ¦¬κ±°λ˜λŠ” 수λͺ…μ£ΌκΈ° μ΄λ²€νŠΈμž…λ‹ˆλ‹€. 즉, npm run μ‚¬μš©ν•˜μ—¬ μ΄λŸ¬ν•œ 슀크립트λ₯Ό μˆ˜λ™μœΌλ‘œ 트리거 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ μˆ˜μ€€μ—μ„œ install λ₯Ό μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ 일뢀 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ hook scripts λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ (즉, μ΄λ²€νŠΈμ™€ λ™μΌν•œ μ΄λ¦„μœΌλ‘œ μ‹€ν–‰ νŒŒμΌμ„ μ •μ˜ ./node_modules/.hooks/ ).

λ‚΄κ°€ ν‹€λ ΈλŠ” 지 그리고 이것이 이전 λ²„μ „μ˜ CLIμ—μ„œ μž‘λ™ μ€‘μž„μ„ λΆ„λͺ…νžˆ μ•Œλ €μ£Όμ‹­μ‹œμ˜€. 여기에 λ‹€λ₯Έ μ˜΅μ…˜μ€ μ—°κ²°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€ (예 : npm install x && npm run y , λ˜λŠ” npm install λ‹€μŒ npm run test μˆ˜ν–‰ν•˜λŠ” npm install install-test & install-ci-test 같은 νŽΈλ¦¬ν•œ λͺ…령이 μžˆμŠ΅λ‹ˆλ‹€ npm run test λŠ” μ‚¬λžŒλ“€μ„μœ„ν•œ 일반적인 μ›Œν¬ ν”Œλ‘œμ˜€μŠ΅λ‹ˆλ‹€)

이것은 npm 6이 μž‘λ™ν•˜λŠ” 방식이 μ•„λ‹™λ‹ˆλ‹€.

npm 6 :

image

npm 7 :

image

흠, 이것에 λŒ€ν•΄ μ’€ 더 μ‚΄νŽ΄λ³΄λ©΄, μ„€μΉ˜λ₯Ό μ‘°μš©νžˆν•˜κ³  μ‹Άμ—ˆκ³ μ΄λ₯Ό μœ„ν•΄ RFCλ₯Ό κ΅¬ν˜„ν–ˆμŒμ„ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€ (μ°Έμ‘° : https://github.com/npm/rfcs/blob/latest/implemented/0022- quieter-install-scripts.md); κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” μ—¬μ „νžˆ 그것듀을 μ‹€ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€. λ‚˜λŠ” 이것을 μ œμΆœν•˜κ³  μš°λ¦¬κ°€ λˆ„κ΅°κ°€λ₯Ό μ’€ 더 파게 ν•  수 μžˆλŠ”μ§€ λ³Ό κ²ƒμž…λ‹ˆλ‹€.

두 번째둜 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Huskyλ₯Ό μ‚¬μš©ν•˜λŠ” ν”„λ‘œμ νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œ μ„€μΉ˜ν•  λ•Œ HuskyλŠ” μ‹€ν–‰λ˜μ§€ μ•ŠμœΌλ©° git 후크λ₯Ό μ„€μΉ˜ν•˜μ§€λ„ μ•ŠμŠ΅λ‹ˆλ‹€. NPM v6μ—μ„œ NPM v7둜 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. OP의 λ¬Έμ œμ™€ μ•½κ°„ λ‹€λ₯Έ ν•œ κ°€μ§€λŠ” μ‹€ν–‰λ˜λŠ” μ„€μΉ˜ ν›„ μŠ€ν¬λ¦½νŠΈκ°€ 루트 ν”„λ‘œμ νŠΈμ˜ μŠ€ν¬λ¦½νŠΈκ°€ μ•„λ‹ˆλΌ Husky의 λͺ¨λ“ˆμ— μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

Husky에 λŒ€ν•œ npm ci 슀 λ‹ˆνŽ« 예 :

$ npm ci
npm WARN prepare removing existing node_modules/ before installation

> [email protected] install ./atlas-server/node_modules/husky
> node husky install

husky > Setting up git hooks
husky > Done

> [email protected] postinstall ./atlas-server/node_modules/husky
> opencollective-postinstall || exit 0

Thank you for using husky!
If you rely on this package, please consider supporting our open collective:
> https://opencollective.com/husky/donate

...

μ €λŠ” lerna λ₯Ό μ‚¬μš©ν•˜κ³  있으며 μ•„λž˜μ™€ 같이 ν”„λ‘œμ νŠΈ μ—μ„œ postinstall λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

  "scripts": {
    "postinstall": "lerna bootstrap",

https://github.com/mobilusoss/textlint-browser-runner/blob/master/package.json#L18

postinstall κ°€ npm v 6.14.8을 μ‚¬μš©ν•˜λŠ” TravisCIμ—μ„œ npm ci 이후에 ν˜ΈμΆœλ˜μ—ˆμŠ΅λ‹ˆλ‹€.
https://travis-ci.com/github/mobilusoss/textlint-browser-runner/builds/191070080

κ·ΈλŸ¬λ‚˜ npm v7.0.3은 postinstall ν˜ΈμΆœν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
https://travis-ci.com/github/mobilusoss/textlint-browser-runner/jobs/403527216

λ‚΄ μ†”λ£¨μ…˜ 은 npm ci 후에 μˆ˜λ™μœΌλ‘œ lerna bootstrap ν˜ΈμΆœν•©λ‹ˆλ‹€.

ν™•μΈν•˜μ‹­μ‹œμ˜€. npm 7.0.0 이후 μ£Όμš” λ³€κ²½ 사항

μ•„λ§ˆλ„ 원인

단일 슀크립트 (npm test, npm start, npm stop 및 npm restart) 만 μ‹€ν–‰ν•˜λŠ” λͺ…령은 이제 --ignore-scriptsκ°€ μ„€μ •λ˜μ–΄ μžˆμ–΄λ„ ν•΄λ‹Ή 슀크립트λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ GA v7.0.0 릴리슀 μ΄μ „μ—λŠ” 사전 / 사후 슀크립트λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (예λ₯Ό λ“€μ–΄ npm test --ignore-scriptsλ₯Ό μ‹€ν–‰ν•˜μ—¬ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•  수 μžˆμ§€λ§Œ linterλŠ” μ‹€ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€.)

이것이 버그 λ˜λŠ” npm 7의 μ£Όμš” λ³€κ²½ μ‚¬ν•­μœΌλ‘œ κ°„μ£Όλ©λ‹ˆκΉŒ?

@darcyclarke @isaacs λŠ” 직접 νƒœκ·Έμ— λŒ€ν•΄ μ‚¬κ³Όν•˜μ§€λ§Œ,이 λ¬Έμ œλŠ” μŠ€ν”„λ¦°νŠΈ λ§ˆμΌμŠ€ν†€ 쀑 ν•˜λ‚˜μ—μ„œ 제거 된 κ²ƒμœΌλ‘œ ν™•μΈλ˜μ—ˆμœΌλ―€λ‘œ μƒλ‹Ήνžˆ μ€‘μš”ν•œ νšŒκ·€μ΄λ―€λ‘œ κ°„κ³Όλ˜μ§€ μ•Šμ•˜λŠ”μ§€ ν™•μΈν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μ›λž˜ λ¬Έμ œμ—μ„œ λͺ…ν™•ν•˜μ§€ μ•Šμ€ 경우λ₯Ό λŒ€λΉ„ ν•œ μ΅œμ†Œν•œμ˜ μž¬ν˜„μž…λ‹ˆλ‹€.

{
  "scripts": {
    "prepare": "echo foo"
  }
}

npm@6 λ₯Ό μ‚¬μš©ν•˜λ©΄ npm install 및 npm ci "foo"λ₯Ό μΈμ‡„ν•©λ‹ˆλ‹€. npm@7 ν•˜λ©΄ npm install λŠ” "foo"λ₯Ό μΈμ‡„ν•˜μ§€λ§Œ npm ci λŠ” μΈμ‡„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ¬Έμ œλŠ” install λͺ…령에 μ μ ˆν•œ μ„€μΉ˜ 슀크립트λ₯Ό λͺ…μ‹œ 적으둜 μ‹€ν–‰ν•˜κΈ°μœ„ν•œ λ‹€μŒ 블둝이 μžˆμ§€λ§Œ ci λͺ…λ Ήμ—λŠ” μ΄λŸ¬ν•œ 블둝이 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

https://github.com/npm/cli/blob/a28aff769a77f127f371c31afcb9e9814722e5cd/lib/install.js#L44 -L62

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰