วิธีการใช้ executables จากแพ็คเกจที่ติดตั้งไว้ใน node_modules


493

ฉันจะใช้โมดูลในระบบnode.jsได้อย่างไร ตัวอย่างเช่นในแอพของฉันฉันติดตั้ง coffee-script:

npm install coffee-script

นี้จะติดตั้งไว้ในคำสั่งและกาแฟอยู่ใน./node_modules ./node_modules/.bin/coffeeมีวิธีเรียกใช้คำสั่งนี้เมื่อฉันอยู่ในโฟลเดอร์หลักของโครงการหรือไม่ ฉันเดาว่าฉันกำลังมองหาสิ่งที่คล้ายกับbundle execในชุดรวม โดยทั่วไปฉันต้องการระบุเวอร์ชันของสคริปต์กาแฟที่ทุกคนที่เกี่ยวข้องกับโครงการควรใช้

ฉันรู้ว่าฉันสามารถเพิ่มการ-gตั้งค่าสถานะเพื่อติดตั้งทั่วโลกเพื่อให้กาแฟทำงานได้ดีทุกที่ แต่ถ้าฉันต้องการมีกาแฟหลายรุ่นต่อโครงการ


9
จำนวนมากของคำแนะนำผมอ่านสิ่งที่พูดเช่นนั้นnpm install niftycommand niftycommandแต่สิ่งนี้จะไม่ทำงานจนกว่าคุณจะมี. / node_modules/.bin ในเส้นทางของคุณใช่ไหม?
Bennett McElwee

2
มีการเขียนที่ดีมากที่นี่: firstdoit.com/… - โดยทั่วไปมันแนะนำให้คุณใส่coffeeคำสั่งของคุณลงในnpm scriptsส่วนเช่นการ"build": "coffee -co target/directory source/directoy", so you can run เรียกใช้ npm build build` จากเทอร์มินัลหลังจากนั้น
Benny Neugebauer

@BennyNeugebauer แน่นอนว่าเป็นสิ่งที่ฉันทำเมื่อเร็ว ๆ นี้แทนที่จะยุ่งกับ PATH
typeoneerror

12
ใช้npxซึ่งมาพร้อมกับnpm 5.2.0 medium.com/@maybekatz/…
onmyway133

คำตอบ:


567

UPDATE : ตามที่ Seyeong Jeong ชี้ให้เห็นในคำตอบของพวกเขาด้านล่างตั้งแต่ npm 5.2.0 คุณสามารถใช้npx [command]ซึ่งสะดวกกว่า

คำตอบเก่าสำหรับรุ่นก่อน 5.2.0 :

ปัญหาเกี่ยวกับการวาง

./node_modules/.bin

ลงใน PATH ของคุณคือมันจะทำงานเฉพาะเมื่อไดเรกทอรีการทำงานปัจจุบันของคุณคือรูทของโครงสร้างไดเรกทอรีโครงการของคุณ (เช่นตำแหน่งที่ตั้งnode_modules)

เป็นอิสระจากไดเรกทอรีการทำงานของคุณคุณจะได้รับเส้นทางของไบนารีที่ติดตั้งภายใน

npm bin

ในการดำเนินการcoffeeไบนารี่ที่ติดตั้งแบบโลคัลโดยไม่ขึ้นกับตำแหน่งที่คุณอยู่ในลำดับชั้นไดเรกทอรีของโครงการคุณสามารถใช้การสร้าง bash นี้

PATH=$(npm bin):$PATH coffee

ฉันใช้นามแฝงเป็น npm-exec

alias npm-exec='PATH=$(npm bin):$PATH'

ดังนั้นตอนนี้ฉันสามารถ

npm-exec coffee

เพื่อเรียกใช้สำเนากาแฟที่ถูกต้องไม่ว่าฉันจะอยู่ที่ไหน

$ pwd
/Users/regular/project1

$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd lib/
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd ~/project2
$ npm-exec which coffee
/Users/regular/project2/node_modules/.bin/coffee

17
คุณสามารถก้าวต่อไปอีกขั้นหนึ่งและalias coffee="npm-exec coffee"
ปกติ

6
เอาท์พุทเปลี่ยนเมื่อคุณ cd เป็นโครงการอื่น มันจะไม่เปลี่ยนแปลงเมื่อคุณ cd ภายในโครงการ npm binค้นหาเชนของ 'ancestor ไดเรกทอรี่' ไปยัง cwd สำหรับไดเร็กทอรี node_modules นี่เป็นพฤติกรรมที่ต้องการอย่างแน่นอนหากคุณต้องการใช้ไบนารีของโมดูลที่ระบุใน package.json ของโครงการ
ปกติ

11
โอ้เอ้ย! ฉันต้องทำอะไรแบบนั้นจริงๆเพื่อให้โมดูลในพื้นที่ทำงานได้หรือไม่ มันค่อนข้างเป็นไปไม่ได้ที่จะอธิบายให้ทีมทราบ! ไม่มีอะไรที่ตรงไปตรงมามากกว่านี้อีกแล้ว
Alexian

17
คุณสามารถใช้สคริปต์ npm ได้ตลอดเวลาเพราะจะค้นหาไบนารีท้องถิ่นก่อน คุณสามารถตั้งค่านามแฝงให้กับไบนารีแต่ละรายการของคุณที่นั่นหรือใช้ชื่อทั่วไปเช่น "build"
Joe Zim

6
@philosodad ไม่จริงคุณไม่ทำ PATHจะกลับมาเป็นสิ่งที่มันเป็นก่อนที่จะอุทธรณ์คำสั่ง การตั้งค่าตัวแปรสภาพแวดล้อมในบรรทัดเดียวกันก่อนเรียกใช้คำสั่งจะมีผลกับสภาพแวดล้อมของคำสั่งนั้นเท่านั้น
ปกติ

410

ตัวอย่างที่ดี

คุณไม่ต้องจัดการ$PATHอีกต่อไป!

จากnpm@5.2.0 , npmมาพร้อมกับnpxแพ็คเกจซึ่งช่วยให้คุณสามารถรันคำสั่งจากโลคัลnode_modules/.binหรือจากแคชกลาง

เพียงแค่เรียกใช้:

$ npx [options] <command>[@version] [command-arg]...

โดยค่าเริ่มต้นnpxจะตรวจสอบว่า<command>มีอยู่ใน$PATHหรือในไบนารีโครงการท้องถิ่นและดำเนินการนั้น

การโทรหาnpx <command>เมื่อ<command>ไม่ได้อยู่ในของคุณ$PATHจะติดตั้งแพคเกจที่มีชื่อนั้นจากรีจิสทรี NPM ให้คุณโดยอัตโนมัติและเรียกใช้งาน เมื่อติดตั้งเสร็จแล้วแพคเกจที่ติดตั้งจะไม่อยู่ที่ใดในโลกดังนั้นคุณไม่ต้องกังวลเกี่ยวกับมลพิษในระยะยาว คุณสามารถป้องกันพฤติกรรมนี้ได้โดยระบุ--no-installตัวเลือก

สำหรับnpm < 5.2.0คุณสามารถติดตั้งnpxแพ็กเกจด้วยตนเองโดยรันคำสั่งต่อไปนี้:

$ npm install -g npx

1
ฉันไม่ชอบการติดตั้งแพ็กเกจ npm โกลบอลของบุคคลที่สามในขณะที่npmและpackage.jsonมีฟังก์ชันการทำงานเกือบเหมือนกัน
guneysus

หากข้อความ "เส้นทางต้องเป็นสตริงได้รับไม่ได้กำหนด" ปรากฏขึ้นนี่คือการแก้ไข: github.com/zkat/npx/issues/144#issuecomment-391031816
Valeriy Katkov

1
คำตอบนี้ดี แต่ฉันแค่อยากจะบอกว่าnpxเป็นคนอ่อนแอ มันควรจะได้รับnpm runหรือnpm execหรือบางสิ่งบางอย่าง
William Entriken

@WilliamEntriken ด้วยเหตุผลบางอย่างnpm run [my-local-package]ไม่ทำงานบน Ubuntu ของฉันแม้ว่าจะดูเหมือนว่าจะทำงานบนอุปกรณ์ Windows
ลานเครื่องจักร

97

ใช้npm binคำสั่งเพื่อรับโหนดโมดูล / bin ของโปรเจ็กต์ของคุณ

$ $(npm bin)/<binary-name> [args]

เช่น

$ $(npm bin)/bower install

4
ฉันชอบวิธีแก้ปัญหาที่ง่ายและทั่วไป ทำให้นามแฝงดูไม่จำเป็น
Matt Montag

ดูเหมือนว่าจะเป็นทางออกที่ดีที่สุดถัดไปที่สง่างามและปลอดภัยกว่าที่ต้องทำexport PATH="./node_modules/.bin:$PATH"
jontsai

1
@ inf3rno คำสั่ง$(npm bin)/jasmineไม่ได้node $(npm bin)/jasmine(คุณอาจจะคิดออก แต่ชี้แจงให้คนอื่น ๆ )
jassa

5
ไม่ใช่วิธีการแก้ปัญหาที่ไม่ดี แต่ไม่ได้ทำงานบนบรรทัดคำสั่ง windows มาตรฐานที่มี $ การวางไว้ในส่วน package.json สคริปต์เป็นวิธีที่ดีกว่าที่ฉันรู้สึกเพราะมันเข้ากันได้มากขึ้น
Timothy Gonzalez

77

ใช้ npm run[-script] <script name>

หลังจากใช้ npm เพื่อติดตั้งแพคเกจ bin ไปยัง./node_modulesไดเรกทอรีในเครื่องของคุณให้แก้ไขpackage.jsonเพื่อเพิ่ม<script name>ดังนี้:

$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "learnyounode": "learnyounode"
},
...
$ npm run learnyounode

มันจะดีถ้าการติดตั้ง npm มีตัวเลือก --add-script หรืออะไรบางอย่างหรือหากการเรียกใช้ npm จะทำงานได้โดยไม่ต้องเพิ่มลงในบล็อกสคริปต์


5
ฉันพบว่าวิธีนี้มีความเหมือนกันมากขึ้นเมื่อต้องรับมือกับนักพัฒนาหลายคนในโครงการ - มันหลีกเลี่ยงความจำเป็นที่จะต้องกำหนดค่าอะไรในพื้นที่ ... คุณเพียงแค่npm installคุณเข้าถึงการพึ่งพา dev ของคุณ ข้อเสียเล็ก ๆ น้อย ๆ เพียงอย่างเดียวคือคุณต้องnpm run eslint(หรืออะไรก็ตาม) คุณสามารถสร้างสคริปต์ชื่อ "เริ่มต้น" ที่ทำงานอึกเพื่อที่คุณจะต้องพิมพ์npm startเพื่อเริ่มเซิร์ฟเวอร์ dev ของคุณ สิ่งที่ยอดเยี่ยมและไม่มีการทุบตีดังนั้นเพื่อน ๆ ใน windows ของคุณยังคงชอบคุณอยู่ :)
jpoveda

1
การเพิ่มชื่อแทนการใส่ $ (npm bin) บนเส้นทางของคุณนั้นฉลาด แต่ความจริงที่ว่าสิ่งนี้จะใช้ได้กับคนที่ไม่มีการตั้งค่าในท้องถิ่นชนะใจฉัน
Conrad.Dean

12
ต้องใช้ upvotes มากกว่านี้! ส่งผ่านไปยังสคริปต์ของคุณหลังจากที่--ชอบ:npm run learnyounode -- --normal-switches --watch -d *.js
ptim

ฉันพบว่านี่เป็นทางออกที่ดีที่สุด มีคำอธิบายในเชิงลึกที่นี่: lostechies.com/derickbailey/2012/04/24/…
adampasz

1
นี่คือสิ่งที่ฉันมักจะทำ แต่ด้วยเหตุผลบางอย่างบนอุปกรณ์ Ubuntu npm run ts-nodeไม่ทำงานสำหรับฉัน ฉันแค่ต้องส่งข้อความถึง npx
ลานเครื่องจักร

42

npm-runใช้

จาก readme:

NPM วิ่ง

ค้นหาและเรียกใช้ไฟล์เรียกทำงานในเครื่องจาก node_modules

สามารถเรียกใช้งานโปรแกรมใด ๆ สำหรับสคริปต์รอบการทำงานของ npm npm-runได้

การใช้

$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable 

การติดตั้ง

$ npm install -g npm-run

8
ไม่โปรดดู npx ที่อ้างถึงด้านบน ... stackoverflow.com/a/45164863/3246805
tj

41

อัปเดต:ฉันไม่แนะนำวิธีนี้อีกต่อไปทั้งเพื่อเหตุผลด้านความปลอดภัยที่กล่าวถึงและไม่ใช่npm binคำสั่งที่ใหม่กว่า คำตอบเดิมด้านล่าง:

ดังที่คุณทราบแล้วไบนารีที่ติดตั้งในเครื่องอยู่ใน./node_modules/.binนั้น หากต้องการเรียกใช้ไบนารีในไดเรกทอรีนี้มากกว่าไบนารีที่มีอยู่ทั่วโลกถ้ามีฉันขอแนะนำให้คุณใส่./node_modules/.binเส้นทางของคุณก่อน:

export PATH="./node_modules/.bin:$PATH"

หากคุณใส่ในของคุณ~/.profile, coffeeจะเป็น./node_modules/.bin/coffeeถ้ามีอย่างอื่น/usr/local/bin/coffee(หรือสิ่งที่คำนำหน้าคุณกำลังติดตั้งโมดูลโหนดใต้)


1
นั่นอาจเป็นทางออกที่ดีที่สุด ฉันยังสร้างสคริปต์ทุบตีที่เรียกว่า "เฝ้าดู" ในโครงการของฉัน:./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
typeoneerror

72
อันตราย Will Robinson! การใช้เส้นทางสัมพัทธ์ใน $ PATH ของคุณจะเปิดช่องโหว่ขนาดของดาวเคราะห์โดยเฉพาะอย่างยิ่งถ้าคุณวางมันไว้ด้านหน้าเป็นรายการแรก หากไดเรกทอรีที่คุณอยู่ในสามารถเขียนได้ทุกคน (พูดที่ไหนสักแห่งใน/tmp) กระบวนการใด ๆ หรือผู้ใช้สามารถจี้เซสชั่นของคุณโดยใส่รุ่นที่เป็นอันตรายของคำสั่งสามัญ (เช่นls, cpฯลฯ ) มี สิ่งเหล่านี้อาจวางไข่ sub-shells ที่มองไม่เห็นจับรหัสผ่านของคุณและอื่น ๆ
ack

จะทำงานเฉพาะในรูทและไม่มีที่อื่น การalias npm-exec='PATH=$(npm bin):$PATH'สั่นไหวคือ
oligofren

1
มันจะเลวร้ายแค่ไหนถ้าคุณไม่ใส่มันเป็นสิ่งแรกในตัวคุณPATHแต่สุดท้าย (โดยใช้$(npm bin)แบบฟอร์ม) ดังนั้นพวกเขาจึงไม่สามารถเขียนทับสิ่งที่มีอยู่ของคุณและคุณจะไว้ใจไฟล์ปฏิบัติการในnpm binไดเรกทอรีอยู่แล้วโดยไม่คำนึงถึงPATHvar; รูปแบบของภัยคุกคามจะเป็นอย่างไรก) คนที่เป็นอันตรายอาจเข้าใช้ระบบไฟล์ของคุณข) พวกเขาเพิ่มไฟล์ปฏิบัติการที่มีชื่อที่ใกล้เคียงกับเครื่องมือระบบเหล่านั้นและ c) คุณพิมพ์ผิดหรือไม่? พยายามทำความเข้าใจกับสถานการณ์ที่ทำให้สิ่งเลวร้ายนี้เนื่องจากคุณเชื่อใจในโปรแกรมปฏิบัติการต่างประเทศเมื่อใช้งาน - npmติดตั้งโปรแกรมแล้ว
osdiab

คุณสามารถใช้กลอุบายกับนามแฝงได้และคุณสามารถกำหนดเส้นทางด้วยตนเองและใช้งานได้ "แต่มันก็ไม่เหมาะ
killscreen

22

โซลูชัน PATH มีปัญหาว่าถ้า $ (ถังขยะ npm) อยู่ใน. profile / .bashrc / etc ของคุณจะถูกประเมินหนึ่งครั้งและจะถูกตั้งค่าเป็นไดเรกทอรีใดเส้นทางที่ได้รับการประเมินเป็นครั้งแรกหากคุณปรับเปลี่ยนเส้นทางปัจจุบันแล้ว ทุกครั้งที่คุณเรียกใช้สคริปต์เส้นทางของคุณจะเติบโต

เพื่อแก้ไขปัญหาเหล่านี้ฉันสร้างฟังก์ชั่นและใช้มัน มันไม่ได้ปรับสภาพแวดล้อมของคุณและใช้ง่าย:

function npm-exec {
   $(npm bin)/$@  
}

สามารถใช้สิ่งนี้ได้โดยไม่ต้องทำการเปลี่ยนแปลงใด ๆ กับสภาพแวดล้อมของคุณ:

npm-exec r.js <args>

2
ฉันชอบสิ่งนี้! ฉันตั้งชื่อฟังก์ชั่นของฉันn
jontsai

มันเยี่ยมมาก! ขอบคุณสำหรับการแบ่งปัน. ฉันเพิ่ม Fish Shell Version ด้านล่าง
LeOn - Han Li

22

หากคุณต้องการรักษา npm ไว้npxควรทำสิ่งที่คุณต้องการ


หากเปลี่ยนเป็นไหมพรม (การเปลี่ยน npm โดย facebook) เป็นตัวเลือกสำหรับคุณคุณสามารถโทร:

 yarn yourCmd

สคริปต์ภายใน package.json จะมีความสำคัญกว่านี้หากไม่พบจะปรากฏใน./node_modules/.bin/โฟลเดอร์

นอกจากนี้มันยังแสดงผลสิ่งที่มันวิ่ง:

$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"

package.jsonดังนั้นคุณจึงไม่ต้องสคริปต์การติดตั้งสำหรับแต่ละคำสั่งในของคุณ


หากคุณมีสคริปต์ที่กำหนดไว้.scriptsภายในpackage.json:

"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first

yarn tscจะเทียบเท่าyarn run tscหรือnpm run tsc:

 yarn tsc
 yarn tsc v0.27.5
 $ tsc

14

อัปเดต: หากคุณอยู่ในช่วงเวลา npm ล่าสุด (เวอร์ชั่น> 5.2)

คุณสามารถใช้ได้:

npx <command>

npxค้นหาคำสั่งใน.binไดเรกทอรีของคุณnode_modules

คำตอบเก่า:

สำหรับ Windows

เก็บสิ่งต่อไปนี้ในไฟล์ที่เรียกว่าnpm-exec.batและเพิ่มลงใน%PATH%

@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*

การใช้

จากนั้นคุณสามารถใช้มันเหมือน npm-exec <command> <arg0> <arg1> ...

ตัวอย่างเช่น

หากต้องการเรียกใช้งานการwdioติดตั้งในไดเร็กทอรี node_modules โลคัลให้ทำ:

npm-exec wdio wdio.conf.js

นั่นคือมันจะทำงาน .\node_modules\.bin\wdio wdio.conf.js


สิ่งนี้ไม่ทำงานในขณะที่ผ่านการโต้แย้งมากกว่า 1 ครั้ง เช่น npm-exec gulp <some_task>
OK999

@ OK9999 ฉันแน่ใจว่าการแก้ไขเล็กน้อยจะอนุญาตให้ผ่านอาร์กิวเมนต์ (เพราะเมื่อคุณส่งผ่านที่นี่จะมีการอ้างอิงใน ""); สิ่งที่ฉันแนะนำคือคัดลอกวางไฟล์อึกจาก bin ไปยังรูทโปรเจ็กต์ของคุณ (การแก้ไขบางอย่างที่จำเป็นของไฟล์ แต่มันจะทำงานโดยไม่ต้องเขียนโค้ดใหม่ ฯลฯ )
Dheeraj Bhaskar

ใช่ฉันลงเอยด้วยการทำเช่นนั้น โฟลเดอร์ node_modules ต้องอยู่ในโฟลเดอร์ที่มีไฟล์ gulpfile อยู่
OK999

6

ฉันไม่ต้องการพึ่งพาสมนามเชลล์หรือแพ็คเกจอื่น

เพิ่มบรรทัดอย่างง่ายไปยังscriptsส่วนของคุณpackage.jsonคุณสามารถเรียกใช้คำสั่ง NPM ท้องถิ่นเช่น

npm run webpack

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack"
  },
  "devDependencies": {
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.11"
  }
}

5

หากคุณต้องการให้ตัวแปร PATH ของคุณอัปเดตอย่างถูกต้องโดยอิงจากไดเรกทอรีการทำงานปัจจุบันของคุณให้เพิ่มสิ่งนี้ไปยังจุดสิ้นสุดของ.bashrc-equivalent ของคุณ(หรือหลังจากสิ่งใดก็ตามที่กำหนดPATH):

__OLD_PATH=$PATH
function updatePATHForNPM() {
  export PATH=$(npm bin):$__OLD_PATH
}

function node-mode() {
  PROMPT_COMMAND=updatePATHForNPM
}

function node-mode-off() {
  unset PROMPT_COMMAND
  PATH=$__OLD_PATH
}

# Uncomment to enable node-mode by default:
# node-mode

การดำเนินการนี้อาจเพิ่มการหน่วงเวลาสั้น ๆ ทุกครั้งที่มีการแสดงพรอมต์ bash (ขึ้นอยู่กับขนาดของโครงการของคุณเป็นไปได้มากที่สุด) ดังนั้นจึงถูกปิดใช้งานตามค่าเริ่มต้น

คุณสามารถเปิดใช้งานและปิดการใช้งานภายในเทอร์มินัลของคุณโดยการเรียกใช้node-modeและnode-mode-offตามลำดับ


4

ฉันใช้วิธีเดียวกันกับ @guneysus เสมอเพื่อแก้ปัญหานี้ซึ่งสร้างสคริปต์ในไฟล์ package.json และใช้มันในการรัน npm run script-name

อย่างไรก็ตามในเดือนล่าสุดฉันใช้npxและฉันรักมัน

ตัวอย่างเช่นฉันดาวน์โหลดโครงการ Angular และฉันไม่ต้องการติดตั้ง Angular CLI ทั่วโลก ดังนั้นด้วยการติดตั้ง npx แทนที่จะใช้คำสั่ง global angular cli (ถ้าฉันติดตั้งไว้) เช่นนี้:

ng serve

ฉันสามารถทำได้จากคอนโซล:

npx ng serve

นี่คือบทความที่ฉันเขียนเกี่ยวกับ NPX และมันเจาะลึกลงไป


2

zxcเหมือนกับ "bundle exec" สำหรับ nodejs มันคล้ายกับการใช้PATH=$(npm bin):$PATH:

$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp


1

คุณสามารถใช้ direnv และเปลี่ยนตัวแปร $ PATH ในโฟลเดอร์การทำงานของคุณเท่านั้น

$ cat .envrc
> export PATH=$(npm bin):$PATH

1

.bashrcเพิ่มสคริปต์นี้เพื่อคุณ จากนั้นคุณสามารถโทรcoffeeหรืออะไรก็ได้ในพื้นที่ สิ่งนี้มีประโยชน์สำหรับแล็ปท็อปของคุณ แต่อย่าใช้บนเซิร์ฟเวอร์ของคุณ

DEFAULT_PATH=$PATH;

add_local_node_modules_to_path(){
  NODE_MODULES='./node_modules/.bin';
  if [ -d $NODE_MODULES ]; then
    PATH=$DEFAULT_PATH:$NODE_MODULES;
  else
    PATH=$DEFAULT_PATH;
  fi
}

cd () {
  builtin cd "$@";
  add_local_node_modules_to_path;
}

add_local_node_modules_to_path;

หมายเหตุ : สคริปต์นี้ทำให้ aliase ของcdคำสั่งและหลังจากการเรียกร้องของแต่ละคนcdมันจะตรวจสอบและเพิ่มเข้าไปในของคุณnode_modules/.bin$PATH

Note2 : NODE_MODULES=$(npm bin);คุณสามารถเปลี่ยนบรรทัดที่สามไป แต่นั่นจะทำให้cdคำสั่งช้าเกินไป


1
ใช้$(npm bin)แทน ./node_modules/.binhardcoding
bfontaine

อืม$(npm bin)ดูเหมือนจะช้าเกินไปที่จะใช้กับแต่ละcdคำสั่ง ฉันกู้คืนรหัสและเพิ่มบันทึกย่อของมันแล้ว
Tsutomu Kawamura


0

ฉันพบปัญหาเดียวกันและฉันไม่ชอบใช้นามแฝง (ตามที่แนะนำเป็นประจำ ) และถ้าคุณไม่ชอบพวกเขาด้วยเช่นกันนี่เป็นวิธีแก้ปัญหาอื่นที่ฉันใช้คุณต้องสร้างสคริปต์ทุบตีปฏิบัติการได้เล็กน้อย พูดsetenv.sh :

#!/bin/sh

# Add your local node_modules bin to the path
export PATH="$(npm bin):$PATH"

# execute the rest of the command
exec "$@"

จากนั้นคุณสามารถใช้สิ่งที่เรียกใช้งานได้ในเครื่องของคุณ/binโดยใช้คำสั่งนี้:

./setenv.sh <command>
./setenv.sh 6to5-node server.js
./setenv.sh grunt

หากคุณกำลังใช้scriptsใน package.json แล้ว:

...,
scripts: {
    'start': './setenv.sh <command>'
}

2
สคริปต์ setenv นี้ไม่จำเป็นสำหรับสคริปต์ package.json npm ได้เตรียมไดเรกทอรี node_modules / .bin ไว้ในพา ธ สำหรับคุณเมื่อเรียกใช้งาน npm run {script}
jasonkarns

0

ฉันชอบที่จะรู้ว่านี่เป็นความคิดที่ไม่ปลอดภัย / ไม่ดี แต่หลังจากคิดไปเล็กน้อยฉันไม่เห็นปัญหาที่นี่:

การแก้ไขโซลูชันที่ไม่ปลอดภัยของ Linus เพื่อเพิ่มลงในส่วนท้ายใช้npm binเพื่อค้นหาไดเรกทอรีและทำให้สคริปต์โทรเฉพาะnpm binเมื่อมีpackage.jsonอยู่ในพาเรนต์ (สำหรับความเร็ว) นี่คือสิ่งที่ฉันคิดไว้zsh:

find-up () {
  path=$(pwd)
  while [[ "$path" != "" && ! -e "$path/$1" ]]; do
    path=${path%/*}
  done
  echo "$path"
}

precmd() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi
}

สำหรับbashแทนที่จะใช้precmdเบ็ดคุณสามารถใช้$PROMPT_COMMANDตัวแปร (ฉันไม่ได้ทดสอบสิ่งนี้ แต่คุณเข้าใจ):

__add-node-to-path() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi   
}

export PROMPT_COMMAND="__add-node-to-path"

การเพิ่มnpm binไปยังจุดสิ้นสุด$PATHอาจไม่สามารถทำงานได้ตามที่ผู้ใช้คาดหวัง: โดยทั่วไปเป็นสิ่งที่สามารถดำเนินการได้ แต่อาจเป็นแพคเกจที่ติดตั้งทั่วโลกด้วยเวอร์ชันอื่น!
LoganMzz

0

ฉันเป็นWindowsผู้ใช้และนี่คือสิ่งที่ได้ผลสำหรับฉัน:

// First set some variable - i.e. replace is with "xo"
D:\project\root> set xo="./node_modules/.bin/"

// Next, work with it
D:\project\root> %xo%/bower install

โชคดี.


0

ในกรณีที่คุณใช้งานfish shellและไม่ต้องการเพิ่มเพื่อ$pathความปลอดภัย เราสามารถเพิ่มฟังก์ชั่นด้านล่างเพื่อเรียกใช้ executables โหนดท้องถิ่น

### run executables in node_module/.bin directory
function n 
  set -l npmbin (npm bin)   
  set -l argvCount (count $argv)
  switch $argvCount
    case 0
      echo please specify the local node executable as 1st argument
    case 1
      # for one argument, we can eval directly 
      eval $npmbin/$argv
    case '*'
      set --local executable $argv[1]
      # for 2 or more arguments we cannot append directly after the $npmbin/ since the fish will apply each array element after the the start string: $npmbin/arg1 $npmbin/arg2... 
      # This is just how fish interoperate array. 
      set --erase argv[1]
      eval $npmbin/$executable $argv 
  end
end

ตอนนี้คุณสามารถเรียกใช้สิ่งที่ชอบ:

n coffee

หรือมากกว่าข้อโต้แย้งเช่น:

n browser-sync --version

หมายเหตุหากคุณเป็นbashผู้ใช้ @ Bob9630 คำตอบคือวิธีการใช้ประโยชน์จากการใช้ bash $@ซึ่งไม่สามารถfishshellทำได้


-9

รวม coffee-script ใน package.json ด้วยรุ่นที่ต้องการในแต่ละโครงการโดยทั่วไปดังนี้:

"dependencies":{
  "coffee-script": ">= 1.2.0"

จากนั้นเรียกใช้การติดตั้ง npm เพื่อติดตั้งการพึ่งพาในแต่ละโครงการ สิ่งนี้จะติดตั้งสคริปต์กาแฟรุ่นที่ระบุซึ่งจะสามารถเข้าถึงได้ในแต่ละโครงการ


ใช่ฉันได้เท่าที่ฉันระบุไว้ในคำถามของฉัน ฉันจะเรียกเฉพาะรายการในโครงการของฉันโดยเฉพาะนอกเหนือจาก. / node_modules/.bin/coffee ได้อย่างไร
typeoneerror

หากคุณเรียกใช้การติดตั้ง npm ด้วย package.json ในโฟลเดอร์หลักของโครงการคุณควรมีโฟลเดอร์. / node_modules/.bin/coffee ในโฟลเดอร์นี้ การใช้. / node_modules/coffee-script/bin/coffee จะเรียกใช้รุ่นกาแฟในพื้นที่ในขณะที่เพียงแค่ใช้กาแฟจะเรียกใช้การติดตั้งทั่วโลก หากคุณมีกาแฟรุ่นอื่นติดตั้งในพา ธ อื่นภายในโฟลเดอร์โครงการนี้คุณสามารถเข้าถึงกาแฟโดยใช้. / path/to/this/installation/coffee
almypal

สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันพยายามใช้ "svgo" และใช้งานได้เมื่อติดตั้งทั่วโลกเท่านั้น ฉันได้ลองแล้วnpm install svgoเช่นเดียวnpm installกับ package.json ทั้งสองวิธีติดตั้ง "สำเร็จ" แต่คำสั่ง "svgo" ยังคงไม่พร้อมใช้งาน
Ryan Wheale

1
Grunt ใช้วิธีนี้อย่างชาญฉลาดและ IMHO ควรใช้แพ็คเกจอื่น ๆ ก่อนอื่นให้คุณติดตั้งgrunt-cliแพคเกจทั่วโลกจากนั้นในไดเรกทอรีโครงการของคุณติดตั้งแพ็คเกจ (แก้ไข) เวอร์ชันใด ๆgruntจากนั้นเมื่อคุณเรียกใช้แพคเกจgruntจะใช้เวอร์ชันท้องถิ่นนี้
แอ๊
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.