แฮชบังที่เหมาะสมสำหรับสคริปต์ Node.js


95

ฉันกำลังพยายามสร้างสคริปต์สำหรับ node.js ที่จะทำงานในหลายสภาพแวดล้อม โดยเฉพาะอย่างยิ่งสำหรับฉันฉันกำลังสลับไปมาระหว่าง OS X และ Ubuntu ในอดีตโหนดติดตั้งเป็นแต่ในระยะหลังมันเป็นnode nodejsที่ด้านบนของสคริปต์ฉันสามารถมี:

#!/usr/bin/env node

หรือ

#!/usr/bin/env nodejs

ฉันต้องการให้สคริปต์ทำงานเป็นไฟล์ปฏิบัติการสำหรับสภาพแวดล้อมใด ๆ ตราบเท่าที่มีการติดตั้งโหนดแทนที่จะมีอย่างใดอย่างหนึ่งต้องระบุคำสั่ง ( ./script-name.jsเทียบกับnode script-name.js)

มีวิธีใดในการระบุ hashbang สำรองหรืออันที่เข้ากันได้ในทั้งสองกรณีสำหรับ node.js?


คุณสามารถสร้างเชลล์สคริปต์ wrapper เพื่อเรียกสคริปต์ของคุณซึ่งพยายามค้นหาว่าโหนดอยู่ที่ใดและเรียกว่าอะไร
Doon

4
คำแนะนำมากมายในคำตอบนี้บนเว็บไซต์ Unix - unix.stackexchange.com/questions/65235/…
sargant

ฉันมีสคริปต์ nodejs ว่าผมเปลี่ยนจาก#!/usr/bin/nodeไป#!/usr/bin/nodejsเมื่อฉันปรับรุ่นจากอูบุนตู 12.04-12.10 และมันถูกเรียกจาก wrapper ที่ตรวจสอบทั้งสองอย่าง สำหรับการอภิปรายของ#!/usr/bin/envสับดูคำถามนี้และคำตอบของฉัน
Keith Thompson

1
มีข้อเสนอ TC39 ในขั้นที่ 3 ที่เรียกว่า "Hashbang Grammar" ซึ่งมีจุดมุ่งหมายเพื่อให้แฮชแบงใช้เป็นมาตรฐาน: github.com/tc39/proposal-hashbang
M. Twarog

คำตอบ:


151

หากสคริปต์ของคุณมีไว้สำหรับนักพัฒนาโหนดคุณควรใช้

#!/usr/bin/env node

และไม่ต้องกังวลกับการพยายามเข้ากันได้กับผู้ที่ติดตั้งโหนดเป็นnodejsไฟล์.

เหตุผล:

  • มันคือสิ่งที่เด็ก ๆ กำลังทำอยู่และถ้าคุณไม่ทำเช่นนั้นคุณก็ไม่เจ๋ง โครงการโหนดที่สำคัญเช่นjshint , กรรม , bowerและแม้แต่npmก็ใช้#!/usr/bin/env nodeเป็น shebang สำหรับสคริปต์ปฏิบัติการของพวกเขา
  • เนื่องจากเด็กเย็นกำลังทำมันทุกคนที่ทำงานร่วมกับโหนดบน Ubuntu ได้มีการจัดตั้ง/usr/bin/nodeเป็น symlink nodejsไป มีคำแนะนำเกี่ยวกับการดำเนินการนี้บน Stack Overflow และทั่วทั้งเว็บ มีแม้แต่nodejs-legacyแพ็คเกจที่มีจุดประสงค์เพื่อสร้าง symlink นี้ให้กับคุณ ผู้ที่ใช้ Node รู้วิธีแก้ไขปัญหานี้บน Ubuntu และต้องทำหากต้องการใช้ซอฟต์แวร์ใด ๆ ที่เคยเขียนใน Node
  • ปัญหาดูเหมือนจะไม่มีอีกแล้วบน Ubuntu 14.04 ฉันเพียงแค่ล้าง Node และวิ่งapt-get install nodejsและมันสร้าง/usr/bin/nodeเป็น symlink /etc/alternatives/nodeไป ฉันสงสัยว่าคนที่ได้รับผลกระทบจากปัญหานี้คือคนกลุ่มน้อยที่หดตัวลง

แม้ว่าคุณจะกำหนดเป้าหมายผู้ที่ไม่รู้หนังสือ แต่คุณอาจยังต้องการใช้งานอยู่#!/usr/bin/env nodeบางทีอาจเพิ่มความต้องการที่เป็นไปได้สำหรับการสร้าง symlink ด้วยตนเองหรือการติดตั้งnodejs-legacyแพคเกจลงในเอกสารการติดตั้งของคุณหากคุณเห็นว่าจำเป็น โปรดทราบว่าหากมีคนที่มีnodejsแต่ไม่มีnodeอยู่พยายามเรียกใช้โปรแกรมของคุณด้วย Shebang ข้างต้นพวกเขาจะเห็น

/ usr / bin / env: node: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว

และGoogling ที่จะช่วยแก้ไขในผลลัพธ์แรกและหลาย ๆ ครั้งในหน้าแรก

หากคุณต้องการให้แน่ใจว่าผู้ใช้สามารถเรียกใช้ซอฟต์แวร์ของคุณในระบบที่nodejsพร้อมใช้งานได้ แต่nodeไม่สามารถใช้งานได้ (หรือnodeโปรแกรมAmateur Packet Radio Nodeอยู่ที่ไหน) คุณสามารถใช้ "shebang สองบรรทัด" นี้ได้ จากUnix & Linux Stack Exchange :

#!/bin/sh
':' //; exec "$(command -v nodejs || command -v node)" "$0" "$@"

console.log('Hello world!');

แต่คุณจำเป็นต้องทำสิ่งนี้จริงๆหรือเมื่อแทบไม่มีใครอยู่ในโลกโหนด?


2
หากการสนับสนุนสำหรับnodejsการปฏิบัติการที่เป็นที่ต้องการคุณอาจพบว่ามันสวยเล็กน้อยเพื่อใช้ shebang ด้วยและ#!/bin/sh //bin/false || exec "$(command -v nodejs || command -v node)" "$0"
lennartcl

2
โปรดทราบว่าคุณไม่สามารถส่งอาร์กิวเมนต์ไปยังโหนดบน Linuxได้เช่น--experimental-modulesหากคุณใช้envบรรทัด shebang นี้ มีแฮ็กอยู่รอบ ๆ แต่พวกเขากำลังน่าเกลียด
Dan Dascalescu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.