2013-12-17 13 views
37

Tôi đang cố gắng tạo tập lệnh cho node.js sẽ hoạt động trong nhiều môi trường. Đặc biệt đối với tôi, tôi đang chuyển đổi qua lại giữa OS X và Ubuntu. Trước đây, nút được cài đặt là node, nhưng sau đó nút này là nodejs. Ở phía trên cùng của kịch bản của tôi, tôi có thể có:Hashbang phù hợp cho các tập lệnh Node.js

#!/usr/bin/env node 

hoặc

#!/usr/bin/env nodejs 

Tôi thà có kịch bản chạy như một thực thi cho một trong hai môi trường miễn là nút được cài đặt chứ không phải là có một hoặc người kia phải chỉ định lệnh (./script-name.jsnode script-name.js).

Có cách nào để chỉ định một băm sao lưu hoặc một băm tương thích trong cả hai trường hợp cho node.js?

+0

bạn có thể tạo một kịch bản trình bao bọc để gọi tập lệnh của bạn, tìm cách xác định vị trí của nút và thời gian được gọi. – Doon

+3

Rất nhiều đề xuất trong câu trả lời này trên trang web Unix - http://unix.stackexchange.com/questions/65235/universal-node-js-shebang – sargant

+0

Tôi có một tập lệnh nodejs mà tôi đã thay đổi từ '#!/Usr/bin/node' thành '#!/usr/bin/nodejs' khi tôi nâng cấp từ Ubuntu 12.04 lên 12.10. Và nó được gọi từ một wrapper để kiểm tra cả hai. Để thảo luận về hack '#!/Usr/bin/env', hãy xem [câu hỏi này] (http://unix.stackexchange.com/q/29608/10454) và [câu trả lời của tôi] (http: // unix. stackexchange.com/questions/29608/why-is-it-better-to-use-usr-bin-env-name-instead-of-path-to-name-as-my/29620#29620). –

Trả lời

63

Nếu kịch bản của bạn được thiết kế để sử dụng bởi các nhà phát triển Node, bạn nên hoàn toàn chỉ cần sử dụng

#!/usr/bin/env node 

và không bận tâm cố gắng để tương thích với những người chỉ đã cài đặt Node như nodejs.

Lý do:

  • Đó là những gì những đứa trẻ mát mẻ đang làm, và nếu bạn không làm điều đó quá, bạn không mát. Các dự án nút chính như jshint, karma, bower và thậm chí npm chỉ cần sử dụng #!/usr/bin/env node làm hình thái cho các tập lệnh thực thi của chúng.
  • Vì những đứa trẻ tuyệt vời đang làm việc đó, bất kỳ ai làm việc với Node trên Ubuntu đều đã thiết lập một số /usr/bin/node làm liên kết tượng trưng đến nodejs. Có highly-viewed instructions khi thực hiện việc này tại đây trên Stack Overflow và trên toàn bộ web. Thậm chí có cả gói nodejs-legacy có toàn bộ mục đích là tạo liên kết tượng trưng này cho bạn. Những người sử dụng Node biết cách khắc phục sự cố này trên Ubuntu và họ phải nếu họ muốn sử dụng nhiều phần mềm bất kỳ được viết trong Node.
  • Vấn đề dường như không còn tồn tại nữa trên Ubuntu 14.04; Tôi vừa mới tẩy sạch Node và chạy một số apt-get install nodejs và nó đã tạo /usr/bin/node làm liên kết tượng trưng đến /etc/alternatives/node. Những người bị ảnh hưởng bởi vấn đề này là, tôi nghi ngờ, một thiểu số thu hẹp.

Thậm chí nếu bạn đang nhắm mục tiêu người Node-không biết chữ, bạn vẫn có thể muốn sử dụng #!/usr/bin/env node, có lẽ thêm sự cần thiết có thể cho tay tạo liên kết tượng trưng hoặc cài đặt của gói nodejs-legacy để tài liệu hướng dẫn cài đặt của bạn nếu bạn thấy cần thiết. Lưu ý rằng nếu ai đó với nodejs nhưng không node cố gắng sẵn để chạy chương trình của bạn với công việc trên, họ sẽ thấy:

/usr/bin/env: nút: Không có tập tin hoặc thư mục

Googling that sẽ cung cấp cho họ bản sửa lỗi trong kết quả đầu tiên và nhiều lần trên trang đầu tiên.

Nếu bạn thực sự, tuyệt vọng muốn chắc chắn rằng người dùng có thể chạy phần mềm của bạn trên một hệ thống nơi nodejs có sẵn nhưng node không phải là (hoặc nơi node thực sự là Amateur Packet Radio Node program), sau đó bạn có thể sử dụng "hai dòng công việc" lấy từ Unix & Linux Stack Exchange:

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

console.log('Hello world!'); 

nhưng bạn có thực sự cần phải làm điều này khi hầu như không có ai khác trong thế giới Node là?

+1

Nếu hỗ trợ cho tập tin thực thi 'nodejs' được ưu tiên, bạn có thể thấy nó đẹp hơn một chút khi sử dụng một shebang với' #!/Bin/sh' và '// bin/false || exec "$ (lệnh -v nodejs || nút lệnh -v)" "$ 0" '. – lennartcl

Các vấn đề liên quan