2013-02-02 41 views
64

Tôi có một số phụ thuộc "toàn cầu" (jshint, csslint, buster, v.v.) mà tôi muốn tự động cài đặt và thực thi qua dòng lệnh khi gói của tôi được cài đặt qua npm install. Điều này có thể không?Cài đặt phụ thuộc "toàn cầu" npm qua package.json

Hiện nay, tôi đang làm những điều sau bằng tay:

  1. npm install -g <package_name>
  2. từ bên trong dự án của tôi: npm link <package_name>

Cập nhật: Chỉ cần đi qua this feature request cho NPM. Có vẻ như cấu hình scripts trong package.json là cách để đi?

Cập nhật lại: Hoặc, sau khi đọc số npm docs, có thể tôi phải sử dụng .gyp file? Tôi bối rối.

Trả lời

42

Không thể chỉ định các phụ thuộc là "chung" từ package.json. Và, đây là thiết kế như Isaac states in that feature request bạn đã tham chiếu:

Vâng, chúng tôi sẽ không bao giờ làm điều này.

Nhưng, "nhị phân" vẫn có thể được sử dụng khi gói được cài đặt cục bộ. Họ sẽ ở số .../node_modules/.bin/. Và, bạn sẽ có thể xếp hàng chúng với preinstall script.

Mặc dù, nếu hàng loạt các lệnh khá dài (như "jshint, csslint, buster, vv .." sẽ đề nghị), bạn có thể muốn xem xét sử dụng một công cụ xây dựng như grunt thực hiện khác nhau nhiệm vụ:

{ 
    // ..., 

    "scripts": { 
     "preinstall": "grunt" 
    } 
} 
+0

Cảm ơn @ Jonathan. Tôi nghĩ bạn đúng. Tôi hiện đang có một nhiệm vụ grunt gọi là 'install' xử lý xây dựng modernizr, jquery, vv .. và sao chép các tập tin ngẫu nhiên vào thư mục lib của tôi. Điều này có nghĩa là các nhà phát triển sẽ cần phải tự cài đặt các gói toàn cầu nhưng tốt thôi, đó không phải là mối quan tâm của ứng dụng của tôi. – uglymunky

+1

Ứng dụng của bạn nên ghi lại các phụ thuộc của nó và theo ý kiến ​​của tôi, hãy đảm bảo rằng chúng tồn tại theo một cách nào đó. – EndangeredMassa

+3

https://www.npmjs.org/doc/misc/npm-scripts.html nói rằng việc sử dụng tập lệnh cài đặt là một mẫu chống. – Fdr

25

tôi thực sự thích các mô hình, nơi bạn cài đặt phụ thuộc địa phương, sau đó sử dụng một kịch bản bash mà bộ PATH của bạn để ./node_modules/.bin.

File: env.sh

# Add your local node_modules bin to the path for this command 
export PATH="./node_modules/.bin:$PATH" 

# execute the rest of the command 
exec "[email protected]" 

Sau đó, bạn có thể sử dụng kịch bản này trước bất kỳ lệnh bash. Nếu bạn ghép nối rằng với một Makefile hoặc NPM kịch bản:

File: Makefile

lint : 
    ./env.sh csslint my_styles 

File: package.json

"scripts": { 
    "lint": "./env.sh csslint my_styles" 
} 

này nhiệm vụ trong những tập tin này trông giống như họ tham khảo csslint ở một số địa điểm toàn cầu, nhưng chúng thực sự sử dụng phiên bản trong bin node_modules của bạn.

Lợi ích thực sự tuyệt vời của việc này là các phụ thuộc này có thể được phiên bản dễ dàng, giống như các mô-đun nút khác của bạn. Nếu bạn gắn bó với một giải pháp cài đặt toàn cầu, bạn có thể đang sử dụng một số phiên bản cụ thể trên hệ thống của người dùng được yêu cầu cho một trong các dự án khác của họ.

+1

Bạn có thể mở rộng lý do tại sao bạn đang sử dụng một kịch bản để thiết lập đường dẫn mỗi khi bạn muốn gọi một lệnh './Node_modules/.bin /'? Trong ví dụ của bạn, mỗi lần bạn chạy 'lint', bạn sẽ thêm'./Node_modules/.bin' vào đường dẫn của mình, ngay cả khi nó đã có sẵn. Tại sao không chỉ thiết lập đường dẫn một lần trong hồ sơ của bạn? Nếu lệnh không có ở đó, trình bao sẽ tiếp tục tìm kiếm phần còn lại của '$ PATH'. – N13

+1

Tôi muốn điều này có thể sử dụng được bởi bất kỳ ai. Tôi có thể thiết lập điều này trong hồ sơ của tôi và nó sẽ làm việc cho tôi, nhưng sau đó tất cả những người khác, những người muốn làm việc trên mô-đun này sẽ phải làm như vậy. Lưu ý rằng './env.sh' không được yêu cầu trong package.json' scripts' nữa. – EndangeredMassa

+2

Tôi vẫn không hiểu tại sao bạn đang đặt 'PATH'. Nếu tất cả các lệnh './Node_modules/.bin /' được định tuyến thông qua 'env.sh', tại sao futz lại có' PATH'? Không phải là 'exec ./node_modules/.bin/$ @' đủ? – N13

7

Bạn nên cố gắng này: https://github.com/lastboy/package-script

Tôi đã sử dụng nó để cài đặt gói NPM toàn cầu trực tiếp từ package.json. Nó hoạt động tốt cho những khách hàng không biết chữ.

Nó thậm chí còn kiểm tra xem các gói đã được cài đặt chưa, nếu không cài đặt chúng!

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