ããã³ãã¨ã³ãã¨ãã¹ãã¼ããã¼ã ã®å°æ(@koba04)ã§ãã
å æ¥ãnpmããèå¼±æ§ã«ã¤ãã¦ã®çºè¡¨ãããã¾ããã 調ã¹ã¦ããä¸ã§ããã¤ãæãã¨ããããã£ãã®ã§è§£èª¬ãå ¼ãã¦æ¸ãã¦ããããã¨æãã¾ãã
The npm Blog — Binary Planting with the npm CLI
npmã®å©ç¨è ã¨ãã¦ããã¹ããã¨ã¯ã
- npmã®ãã¼ã¸ã§ã³ã6.13.4以ä¸ã«ããã
- yarnã®ãã¼ã¸ã§ã³ã1.21.1以ä¸ã«ããã
ã§ãã npmã®ãã¼ã¸ã§ã³ã6.13.4ã«ãªã£ãNodeãv8, v10, v12, v13ç³»ã§ãããããªãªã¼ã¹ãããã®ã§ããã¡ããå©ç¨ãããã¨ãå¯è½ã§ã ï¼yarnã®ãã¼ã¸ã§ã³ã¯å¥éãããå¿ è¦ãããã¾ãï¼ã
npmã«ããçºè¡¨ã§ã¯ãä»åçºè¡¨ãããèå¼±æ§ã¯2ä»¶ãããããããããåå¥ã«èãã¾ãã
binã«ä»»æã®ãã¹ãæå®åºæ¥ãä»¶
npmããã±ã¼ã¸ã¯package.json
ã®bin
ãã£ã¼ã«ãã«ãã¤ã³ã¹ãã¼ã«ãããã¨ã§ä½¿ããããã«ãªãã³ãã³ããæå®åºæ¥ã¾ãã
ä¾ãã°ãeslint
ã®å ´åã¯ä¸è¨ã®ããã«æå®ããã¦ãããããã¤ã³ã¹ãã¼ã«ããã¨eslint
ã³ãã³ããnpm-scriptsãnpxçµç±ã§å©ç¨å¯è½ã«ãªãã¾ãã
ããã±ã¼ã¸ãã°ãã¼ãã«ã«ã¤ã³ã¹ãã¼ã«ããªãå ´åããã®ã³ãã³ãã¯node_modules/.bin
ã«é
ç½®ããã¾ãã
npm-scriptsã®å®è¡æã¯ããã«PATHãéã£ã¦ãããããnpm-scriptsã§ã¯eslint
ã³ãã³ãã¨ãã¦å®è¡ã§ãã¾ãã
ä»åã¯èå¼±æ§ã®è©±ãªã®ã§è©³ãã解説ãã¾ããããbin
ã«è峿ã£ã人ã¯ä¸è¨ã®ããã¥ã¡ã³ããåç
§ãã¦ãã ããã
ä»åã®èå¼±æ§ã¯ããã®ã³ãã³ãåã®é¨åã«ã../../cd
ãªã©ã¨æå®ãããâ¦ï¼ã¨ãã話ã§ãã
ç¾ç¶ã§ã¯ç¹ã«ã³ãã³ãåã«å¯¾ãããã§ãã¯ãè¡ããã¦ããªãã£ããããã¤ã³ã¹ãã¼ã«ããã ãã§ä»»æã®ãã¡ã¤ã«ãç½®ãæãããã¨ãå¯è½ã§ããããããèå¼±æ§ã§ããã¨å¤å®ããã¾ããã
npmã§ã¯ããã®è¾ºãã®commitã§ä¿®æ£ããã¦ãã¾ãï¼å é¨ã§å©ç¨ãã¦ããå¥ããã±ã¼ã¸ã®ä¿®æ£ï¼
yarnã§ã¯ããã®è¾ºãã®commitã§ä¿®æ£ããã¦ãã¾ã
ãã®èå¼±æ§ã¯ãå«ä¾åã®ãããªéçºè èªèº«ãæç¤ºçã«æå®ããã«ã¤ã³ã¹ãã¼ã«ãããä¾åããã±ã¼ã¸ããã§ãæªç¨å¯è½ãªããã対å¿ãã¹ãã§ãã
ã°ãã¼ãã«ã«ã¤ã³ã¹ãã¼ã«ããããã±ã¼ã¸ãå¥ã®ã³ãã³ãã䏿¸ãã§ããä»¶
npmã¯ããã¸ã§ã¯ããã¼ã«ã«ã«ããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããã ãã§ãªã--global(-g
)ãã©ã°ã使ããã¨ã§ã°ãã¼ãã«ã«ããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ã§ãã¾ãã
yarnã®å ´åã¯ãglobal
ã³ãã³ããå©ç¨ãã¾ãã
ã°ãã¼ãã«ã«ããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããå ´åãããã±ã¼ã¸ãæä¾ããã³ãã³ãã®ã·ã³ããªãã¯ãªã³ã¯ã/usr/local/bin
以ä¸ã«ä½æããã¾ãï¼ä½æãããå ´æã¯å®è¡ç°å¢ã«ããç°ãªãã¾ãï¼ã
/usr/local/bin
ã¨ããã°ãä»ã«ãHomebrewãªã©ã§ã¤ã³ã¹ãã¼ã«ããããã±ã¼ã¸ã®ã³ãã³ããé
ç½®ãããå ´æã§ãã
ãã®èå¼±æ§ã¯ãã°ãã¼ãã«ã«ã¤ã³ã¹ãã¼ã«ãããããã±ã¼ã¸ããbin
ã«æå®ãã¦ããã³ãã³ãã«ãã£ã¦ãã§ã«ããå¥ã®ã³ãã³ãã䏿¸ãã§ããã¨ãããã®ã§ãã
ä¾ãã°jq
ãHomebrewãä½ãã§ã¤ã³ã¹ãã¼ã«ãã¦ããç¶æ
ã§ãæªæã®ããnpmããã±ã¼ã¸ãã°ãã¼ãã«ã«ã¤ã³ã¹ãã¼ã«ããå ´åããã®bin
ãã£ã¼ã«ãã«"jq" : "evil.js"
ã®ããã«æ¸ããã¦ããã¨ãjqã³ãã³ãã䏿¸ãããã¦ãã¾ãã¨ãããã¨ã§ãã
ã°ãã¼ãã«ã«ã¤ã³ã¹ãã¼ã«ãããã¨èªä½ããããªã«å¤ããªãã®ã¨ãããããããªãnpmããã±ã¼ã¸ãã°ãã¼ãã«ã«ã¤ã³ã¹ãã¼ã«ãããã¨ã¯ã»ã¨ãã©ãªãã¨æãã®ã§ã1ã¤ãã®ãã®ã«æ¯ã¹ãã¨æ·±å»åº¦ã¯ä½ãããªã¨æãã¾ãã
npmã§ã¯ããã®è¾ºãã®commitã§ä¿®æ£ãã¦ãã¾ãã
å¯¾å¿æ¹æ³ã¨ãã¦ã¯ããã§ã«ã³ãã³ããåå¨ããå ´åãã·ã³ããªãã¯ãªã³ã¯å ãä»ããã¤ã³ã¹ãã¼ã«ãããã¨ãã¦ãããã®ã¨åããã©ãã確èªãã¦ãã¾ãã
yarnã§ã¯ãããã«å¯¾ããä¿®æ£ã¯ã¾ã è¡ããã¦ãã¾ããã ãªã®ã§ãä¸è¨ã®issueã§ã©ãããã®ãèãã¦ã¿ã¾ããã
ä¸è¨ã®Issueã«ããã¨ãyarnã§ã¯ä»åã®ä»¶ãä¸è¨ã®3ã¤ã«åãã¦èãã¦ãã¾ãã
- Binary planting
- Out-of-tree execution
- Binary overlap
Binary plantingã¯1ã¤ç®ã«ç´¹ä»ããèå¼±æ§ã§ãåè¿°ããéãyarnã¯1.21.1ã§ä¿®æ£æ¸ã¿ã§ãã
Out-of-tree executionã¯ãbinãã£ã¼ã«ãã®ã³ãã³ãåã®é¨åã§ã¯ãªãããã¡ã¤ã«ãã¹ãæå®ããå´ã«/home/foo/bar
ã®ããã«æå®ãããã¨ã§ä»»æã®ãã¤ã³ãã«å¯¾ããã·ã³ããªãã¯ãªã³ã¯ã使ã§ããã¨ãããã®ã§ãã
{ "bin": { "foo": "/home/foo/bar" } }
ããã«ã¤ãã¦ã¯ãBinary plantingã®å¯¾å¿ã¨åæã«å¯¾å¿ããã¦ãã¾ãã ãã ããã¡ãã«é¢ãã¦ã¯ãèå¼±æ§ã§ã¯ãªãbugfixã¨ããæ±ãã«ãã¦ãã¾ãã
Binary overlapã¯2ã¤ç®ã«ç´¹ä»ããä»¶ã§ãããyarnã§ã¯å¯¾å¿ããã¦ããªããã®ã§ãã 対å¿ããªãçç±ã¨ãã¦ã¯ãä¸è¨ã®Issueã§ã¯ä¸è¨ã®ããã«èª¬æããã¦ãã¾ãã
- éå»ã«Binary overlapãæå³çã«ãã£ã¦ããããã±ã¼ã¸ãããããã®æåã«å¯¾ãã¦Breaking Changeã¨ãªããã
- ãããã®ããã±ã¼ã¸ã¯ãã¦ã¼ã¶ã¼ãæå³ãã¦ã¤ã³ã¹ãã¼ã«ããããã±ã¼ã¸ã§ãããã
ãã®ãããç¹ã«ã°ãã¼ãã«ãªããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããå ´åã«ã¯ãæ³¨ææ·±ãè¡ãå¿ è¦ãããã¾ãã
ä¸è¨ã®Issueã«ããã¨ãyarnã¯v2ã§bin
ã¹ã¯ãªããã¯Nodeãéãã¦ã®ã¿å®è¡å¯è½ã«ãããã¨ãè¨ç»ãã¦ããããã§ãã
ããã«ãããNodeä¸ã§ãµã³ãããã¯ã¹ç°å¢ãæ§ç¯ãã¦ãã®ä¸ã§å®è¡ããããã¨ãå¯è½ã«ã§ããå¯è½æ§ãããã¾ãã
yarnã¯Nodeããã®ãããªã»ãã¥ãªãã£ããªã·ã¼ãå®è£
ãããã¨ãæå¾
ãã¦ãã¾ãã
postinstallã¨install
ä»åã®èå¼±æ§ã«ã¤ãã¦ã¯ããã¾ã§ã§ãããåè¿°ããIssueã§ã¯postinstall
ã®å±éºæ§ã«ã¤ãã¦ãè¨åããã¦ãã¾ãã
npmã§ã¯ãpublishãpackãªã©ãä»»æã®ã¿ã¤ãã³ã°ã§å¼ã°ããscriptãnpm-scriptsã¨ãã¦ç»é²åºæ¥ãä»çµã¿ãããã¾ãã ã©ã®ãããªscriptãç»é²åºæ¥ãã®ãã¯ä¸è¨ã®ãã¼ã¸ãã確èªå¯è½ã§ãã
ãã®ä¸ã«ãinstall
ã¨postinstall
ãããã¾ãã
ãããã¯å©ç¨è
ãããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããéã«å®è¡ãããã¹ã¯ãªããã§ãã
ã¤ã¾ãããã npm install
ããã ãã§ã¤ã³ã¹ãã¼ã«ããããã±ã¼ã¸ã«å¯¾ãã¦ä»»æã®ã¹ã¯ãªããå®è¡ã許å¯ãã¦ãããã¨ã«ãªãã¾ãã
ãã®ãããçµæçã«æªæã®ããããã±ã¼ã¸ãä¾åé¢ä¿ã«å«ã¾ãã¦ãã¾ã£ãå ´åã«ã¯ãnpm install
ããã ãã§æªæã®ããã¹ã¯ãªãããå®è¡ããã¦ãã¾ãã¾ãã
ã¤ã¾ããä»åã®ãããªèå¼±æ§ãå©ç¨ããã¨ãæªæã®ããããã±ã¼ã¸ã¯ãã¾ãä¾åé¢ä¿ã«å«ã¾ãããã¨ã«æåããã°ä»»æã®ã¹ã¯ãªãããã¦ã¼ã¶ã¼ç°å¢ã§å®è¡ã§ãã¾ãã â¦ã
ãã®ããã®å¯¾çã¨ãã¦ãnpm-scriptsã®å®è¡ãããªãããã®--ignore-scripts
ã¨ãããªãã·ã§ã³ãããã¾ãã
ãããå©ç¨ãããã¨ã§ã¤ã³ã¹ãã¼ã«æã«ä»»æã®ã¹ã¯ãªããã®å®è¡ãæå¦ãããã¨ãå¯è½ã§ãã
ãã ãããã使ãããã«ã¯ãªãinstall
ãpostinstall
ã使ããã¦ããã®ããçè§£ããå¿
è¦ãããã¾ãã
ç¾ç¶ãä¸è¨ã®2ç¹ã®ç¨éã§å©ç¨ããã¦ãããã¨ãå¤ãã¨æãã¾ãã
- ã¦ã¼ã¶ã¼ç°å¢ã«å¿ããå¦ç
- C, C++ãªã©ã®ã³ã¼ããå«ãã ãã¤ãã£ãã¢ã¸ã¥ã¼ã«ã®ãã«ã
- ç°å¢ã«å¿ãããã¤ããªã®ãã¦ã³ãã¼ã
- Fundingã®ãé¡ã
1ã®ã±ã¼ã¹ã§è¨ãã°ãfsevents
ãpuppeteer
ãªã©ãããç®ã«ã±ã¼ã¹ã§ã¯ãªãã§ããããã
ãã ãfsevents
ã«é¢ãã¦ã¯ä¸è¨ã®PRã§install
ã¹ã¯ãªãããå®è¡ããªãããã«ãªã£ã¦ããã®ã§ãææ°çã ã¨ã¤ã³ã¹ãã¼ã«ã¹ã¯ãªããã¯å®è¡ããã¾ããã
puppeteerã§ã¯ä¸è¨ã®ã¹ã¯ãªããã§chromiumã®ãã¤ããªããã¦ã³ãã¼ããã¾ãã
2.ã®ã±ã¼ã¹ã¯ãæè¿npm install
ãnpm ci
ã®éã«å¤§éã®fundingã®ãé¡ãã®ã¡ãã»ã¼ã¸ãç®ã«ãããã¨ãããã®ã§ã¯ãªãã§ããããï¼
ããã¯ãå¤ãã®å ´åpostinstall
ã使ã£ã¦console.log
ã§ã¡ãã»ã¼ã¸ãåºåãããã¨ã§å®ç¾ããã¦ãã¾ãã
ã§ã¯ãããããªãããã¨ãåºæ¥ãã®ãã¨ãããã¨ã§ãããã¾ã2ã®ã±ã¼ã¹ã«ã¤ãã¦ã¯è¨ãã°ãnpm v6.13ãããµãã¼ãããã¦ããfunding
ã®ãã£ã¼ã«ãã使ããã¨ã§ãnpm fund
ã³ãã³ãã§åºåãããã¨ãã§ãã¾ãã
The npm Blog — Updates to Community, Docs & more...
npm install
ã§ããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããæã«npm fund
ã«å¯¾å¿ããããã±ã¼ã¸ãä¾åã«ããã¨ãä¸è¨ã®ãããªå½¢ã§åºåããã¾ãã
: added 15 packages from 17 contributors and audited 15 packages in 1.574s 2 packages are looking for funding run `npm fund` for details found 0 vulnerabilities
npm fund
ãå®è¡ããã¨ä¸è¨ã®ãããªå½¢ã§åºåããã¾ãã
% npm fund [email protected] ââ⬠[email protected] âââ type: charity âââ url: https://www.justgiving.com/refugee-support-europe ââ⬠[email protected] âââ type: opencollective âââ url: https://opencollective.com/core-js
ä»åã®èå¼±æ§ã«ãããå¤ãã®ã¦ã¼ã¶ã¼ã¯npm 6.13.4以ä¸ãå©ç¨ããããã«ãªããããnpm fund
ã³ãã³ããå©ç¨å¯è½ã«ãªãã¾ãã
ãã®ãããpostinstall
ã§ã¯ãªãnpm fund
ã使ãããã®æºåãæ´ã£ãã¨ãè¨ãã¾ãã
yarnã¯ç¾å¨fund
ã³ãã³ãããµãã¼ããã¦ãã¾ããããåè¿°ããIssueã«ããã¨v2ã«ã¯å®è£
ãã¦ããã¯ãã¼ããããã¨ãæ¤è¨ããã¦ããããã§ãã
1ã®ã±ã¼ã¹ã«ã¤ãã¦ã¯ãããã©ã¼ãã³ã¹ç®çã§C, C++ã§æ¸ãã¦ããå ´åã«ã¯ãWebAssemblyã§ç½®ãæãããã¨ãå¯è½ããããã¾ããã ãã ãNodeããµãã¼ããã¦ããªããã¤ãã£ãã®APIã使ãããå ´åã«ã¯ãç¾æç¹ã§ã¯ã¾ã 使ãç¶ããå¿ è¦ãããããã§ãã å°æ¥çã«ã¯ããã«ã¤ãã¦ãWebAssemblyã§è§£æ±ºåºæ¥ãå¯è½æ§ã¯ããããããã¾ãããã
ããããã®ç¾ç¶ã¨ãã¦ãã©ããªã¹ã¯ãªãããèªåã®ããã¸ã§ã¯ãã®npm install
æã«å®è¡ããã¦ããã®ãææ¡ãã¦ãã人ã¯å°ãªãã®ã§ã¯ãªãã§ããããï¼
ã¤ã³ã¹ãã¼ã«æ¸ã¿ã®ããã±ã¼ã¸ã§install
ã¾ãã¯postinstall
ã®ã¹ã¯ãªããããããã®ãåºåããããã®npm packageãä½ã£ã¦ã¿ãã®ã§èå³ãã人ã¯èªèº«ã®ããã¸ã§ã¯ãã§å®è¡ãã¦ã¿ã¦ãã ããã
% npx install-scripts
ãã¡ãã¯ç¤¾å
ã®ããã¸ã§ã¯ãã§å®è¡ããçµæã§ãã
ãã®ä¸ã§åä½ã«å¿
è¦ãªscriptã¯fsevents
ã¨puppeteer
ã ãã§ãããä»ã¯å
¨ã¦fundingé¢é£ã§ãã
core-js scripts: postinstall: node scripts/postinstall || echo "ignore" paths: node_modules/@babel/polyfill/node_modules/core-js/package.json node_modules/@storybook/addon-actions/node_modules/core-js/package.json node_modules/@storybook/addon-knobs/node_modules/core-js/package.json node_modules/@storybook/addon-links/node_modules/core-js/package.json node_modules/@storybook/addon-viewport/node_modules/core-js/package.json node_modules/@storybook/addons/node_modules/core-js/package.json node_modules/@storybook/api/node_modules/core-js/package.json node_modules/@storybook/channel-postmessage/node_modules/core-js/package.json node_modules/@storybook/channels/node_modules/core-js/package.json node_modules/@storybook/client-api/node_modules/core-js/package.json node_modules/@storybook/client-logger/node_modules/core-js/package.json node_modules/@storybook/components/node_modules/core-js/package.json node_modules/@storybook/core/node_modules/core-js/package.json node_modules/@storybook/core-events/node_modules/core-js/package.json node_modules/@storybook/node-logger/node_modules/core-js/package.json node_modules/@storybook/react/node_modules/core-js/package.json node_modules/@storybook/router/node_modules/core-js/package.json node_modules/@storybook/theming/node_modules/core-js/package.json node_modules/@storybook/ui/node_modules/core-js/package.json node_modules/fetch-mock/node_modules/core-js/package.json node_modules/lazy-universal-dotenv/node_modules/core-js/package.json node_modules/simplebar/node_modules/core-js/package.json node_modules/wait-on/node_modules/core-js/package.json core-js-pure scripts: postinstall: node scripts/postinstall || echo "ignore" paths: node_modules/core-js-pure/package.json fetch-mock scripts: postinstall: node scripts/support-fetch-mock.js paths: node_modules/fetch-mock/package.json fsevents scripts: install: node install paths: node_modules/fsevents/package.json puppeteer scripts: install: node install.js paths: node_modules/puppeteer/package.json styled-components scripts: postinstall: node ./scripts/postinstall.js || exit 0 paths: node_modules/styled-components/package.json
fetch-mock
ã¯ææ°çã§ã¯ãã§ã«fund
ã使ãããã«ãªã£ã¦ãã¾ãcore-js
ã«ã¤ãã¦ã¯ãã¡ãã§è°è«ããã¦ãã¾ãããä»ã®ã¨ããåé¤ããäºå®ã¯ãªãããã§ãstyled-components
ã«ã¤ãã¦ã¯éå»ã«è°è«ãããIssueããªãã£ãã®ã§ç¢ºèªãã¦ã¿ã¾ãã
ä¸è¨ã®ããã«çµã¿åããããã¨ã§å¿ è¦ãªã¹ã¯ãªããã®ã¿ãå®è¡ãããã¨ãå¯è½ã§ãã
% npm ci --ignore-scripts
% npx install-scripts
yarnã¯postinstallã«ã¤ãã¦ãæ¢åã®ã¨ã³ã·ã¹ãã ãå£ãã¦ãã¾ãã®ã§v2ã§å ¨ã¦ç¡å¹ã«ãããã¨ã¯é£ããã§ãããv3ã§ã¯èãã¦ããããã§ãã ãã ããç¾æç¹ã§ãæåã§ãã¯ã¤ããªã¹ã管çã«ãã£ã¦è¨±å¯ãããscriptã®ã¿å®è¡å¯è½ã«ãããã¨ã¯å¯è½ã ã¨ãã¦ãã¾ãã
å®éã«postinstall
ãinstall
ã調ã¹ã¦ã¿ãçµæã¨ãã¦ã¯ãããã¾ã§å¤ããªããªã¨ããææ³ã ã£ãã®ã§--ignore-scripts
ã使ã£ãéç¨ããã®ãå¯è½ã§ããããã«æãã¾ããã
ãã®ããã«ããä»åº¦ã¯packageããã¯ã¤ããªã¹ãã§æå®ãã¦å®è¡ã§ããnpm packageãä½ã£ã¦ã¿ããããªã¨æãã¾ããã
ãã ããèªä½ã¯npmèªä½ã対å¿ãã¹ãåé¡ã§ããã¨æããã®ã§ãFeature Requestãéãã¾ããã
以åã«ã¯ä¸è¨ã®event-stream
ã«å¯¾ããåé¡ãããã¾ããããç¾ç¶ã§ã¯ã¤ã³ã¹ãã¼ã«ããããã±ã¼ã¸ãå
¨ã¦ææ¡ãããã¨ã¯ç¾å®çã§ã¯ããã¾ããã
The npm Blog — Details about the event-stream incident
ä»åã®èå¼±æ§ãéãã¦ãnpmã®ç¾ç¶ãå°æ¥ã®æ¹åæ§ãªã©ãèããæ©ä¼ã«ãªãã°ãããªã¨æã£ã¦ãã®è¨äºãæ¸ãã¾ããã
ãµã¤ãã¦ãºã§ã¯ãèå¼±æ§ããã£ãæã«commit logèªãã§åå ãæ¢æ±ããããªãã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãï¼