yarn upgrade로 업데이트할 수 없는 간접 종속 패키지만 업그레이드하려면

4949 단어 YARNNode.js

TL; DR:



yarn v1 의 경우, yarn.lock 로부터 해당의 패키지의 섹션을 삭제해 yarn install 하면 업그레이드할 수 있다.

2021년 9월 9일 추가: yarn v2 이상에서는 yarn up -R パッケージ로 업그레이드할 수 있게 되었다.

어려움



GitHub에서 소스 코드를 호스팅하는 npm 패키지에서 GitHub의 Security Alerts가 fstream < 1.0.12의 취약점을보고했습니다.


yarn upgrade fstream 에서 최신 버전으로 업그레이드하려고 했지만…
$ cd my_npm_pkg

$ yarn upgrade fstream
yarn upgrade v1.16.0
[1/5] 🔍  Validating package.json...
[2/5] 🔍  Resolving packages...
[3/5] 🚚  Fetching packages...
[4/5] 🔗  Linking dependencies...
warning " > [email protected]" has unmet peer dependency "babel-runtime@>= 6".
[5/5] 🔨  Rebuilding all packages...
success Saved lockfile.
success Saved 0 new dependencies.
✨  Done in 7.07s.

$ git diff
(出力なし)

실행해도 yarn.lock 가 변화하지 않는다. 이것은, 이 npm 패키지가 fstream 에 직접적으로 의존하고 있지 않기 때문이었다.

조사



어떤 패키지가 fstream에 의존하는지는 yarn why fstream
$ yarn why fstream
yarn why v1.16.0
[1/4] 🤔  Why do we have the module "fstream"...?
[2/4] 🚚  Initialising dependency graph...
[3/4] 🔍  Finding dependency...
[4/4] 🚡  Calculating file sizes...
=> Found "[email protected]"
info Reasons this module exists
   - "node-sass#node-gyp" depends on it
   - Hoisted from "node-sass#node-gyp#fstream"
   - Hoisted from "node-sass#node-gyp#tar#fstream"
info Disk size without dependencies: "140KB"
info Disk size with unique dependencies: "416KB"
info Disk size with transitive dependencies: "788KB"
info Number of shared dependencies: 12
✨  Done in 0.70s.

원래를 추적하면(이 npm 패키지가 직접적으로 의존하고 있다) node-sass 가 간접적으로 fstream 을 끌어들인 것 같다.

해결책



1. node-sass를 다시 설치합니다.


yarn remove node-sass && yarn add -D node-sass에서 node-sass를 다시 설치하면 이번에는 해결할 것입니다.

다만, 이렇게 하면 node-sass 가 의존하는 패키지가 모두 업그레이드 되어 버린다. 호환성이 있는 semver의 범위내에서 업그레이드 된다고는 해도, 일단 차분을 체크하지 않으면 안심할 수 없다. 향후 비슷한 상황이 되고, fstream 에 의존하는 패키지가 복수로 늘어나면, 차분은 더욱 커질 것으로 예상된다. 가능하면 fstream만 업그레이드하고 싶습니다.

2. yarn.lock에서 fstream을 지우고 yarn install



yarn.lock에서 fstream을 지우고 yarn install 그렇다면 어떨까 생각해 보았습니다.

우선 yarn.lock 에서 fstream 으로 시작하는 행을 찾아, 그 섹션을 통째로 삭제한다.
$ git diff
diff --git a/yarn.lock b/yarn.lock
index 3983d00b8b..9a3e1ef0cf 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3624,15 +3624,6 @@ fsevents@^1.2.7:
     nan "^2.9.2"
     node-pre-gyp "^0.10.0"

-fstream@^1.0.0, fstream@^1.0.2:
-  version "1.0.11"
-  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
-  dependencies:
-    graceful-fs "^4.1.2"
-    inherits "~2.0.0"
-    mkdirp ">=0.5 0"
-    rimraf "2"
-
 function-bind@^1.0.2, function-bind@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
yarn install를 실행하고 yarn.lock이 업데이트되었는지 확인하십시오.
$ yarn install
(略)
$ git diff
diff --git a/yarn.lock b/yarn.lock
index 3983d00b8b..3a44640600 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3625,8 +3625,9 @@ fsevents@^1.2.7:
     node-pre-gyp "^0.10.0"

 fstream@^1.0.0, fstream@^1.0.2:
-  version "1.0.11"
-  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  version "1.0.12"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
+  integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==
   dependencies:
     graceful-fs "^4.1.2"
     inherits "~2.0.0" 

fstream 섹션이 부활하여 최신 버전으로 업그레이드된 것을 알 수 있다.

yarn.lock의 일부를 다시 쓸 수 있습니까?



yarn 의 의존 해결 알고리즘을 이해하고 있는 것은 아니지만, 아마 괜찮을 것이다. yarn.lock 에 쓰여져야 하는 패키지가 빠져 있다면, yarn install 는 자동적으로 패키지를 설치해 yarn.lock 에 추기한다고 생각된다. package.json 의 dependencies 에 손으로 패키지를 덧붙이고 나서 yarn install 하는 것과 상황은 같기 때문에.

비고: 환경


  • node 10.16.0
  • npm 6.9.0
  • yarn 1.16.0 (yarn lockfile v1)
  • 좋은 웹페이지 즐겨찾기