2 hướng dẫn về gulp nói rằng tôi cần cài đặt gulp trước trên toàn cầu (với cờ -g) và sau đó thêm một lần nữa cục bộ. Tại sao tôi cần cái này?
2 hướng dẫn về gulp nói rằng tôi cần cài đặt gulp trước trên toàn cầu (với cờ -g) và sau đó thêm một lần nữa cục bộ. Tại sao tôi cần cái này?
Câu trả lời:
Khi cài đặt một công cụ trên toàn cầu, nó sẽ được người dùng sử dụng như một tiện ích dòng lệnh ở bất cứ đâu, kể cả bên ngoài các dự án nút. Cài đặt toàn cầu cho một dự án nút là xấu vì chúng làm cho việc triển khai khó khăn hơn.
Các npx
tiện ích đi kèm với npm
5.2
giải quyết vấn đề này. Với nó, bạn có thể gọi các tiện ích được cài đặt cục bộ như các tiện ích được cài đặt trên toàn cầu (nhưng bạn phải bắt đầu lệnh với npx
). Ví dụ: nếu bạn muốn gọi một cài đặt cục bộ eslint
, bạn có thể làm:
npx eslint .
Khi được sử dụng trong một script
trường của gói.json của bạn, npm
tìm kiếm node_modules
công cụ cũng như các mô-đun được cài đặt trên toàn cầu, vì vậy cài đặt cục bộ là đủ.
Vì vậy, nếu bạn hài lòng với (trong gói.json của bạn):
"devDependencies": {
"gulp": "3.5.2"
}
"scripts": {
"test": "gulp test"
}
vv và chạy với npm run test
sau đó bạn không cần cài đặt toàn cầu.
Cả hai phương pháp đều hữu ích để giúp mọi người thiết lập dự án của bạn vì sudo
không cần thiết. Điều đó cũng có nghĩa là gulp
sẽ được cập nhật khi phiên bản bị lỗi trong gói.json, vì vậy mọi người sẽ sử dụng cùng một phiên bản gulp khi phát triển cùng với dự án của bạn.
Dường như gulp có một số hành vi bất thường khi được sử dụng trên toàn cầu. Khi được sử dụng như một cài đặt toàn cầu, gulp tìm kiếm một gulp được cài đặt cục bộ để vượt qua sự kiểm soát. Do đó, cài đặt toàn cầu gulp yêu cầu cài đặt cục bộ gulp để hoạt động. Câu trả lời ở trên vẫn đứng. Cài đặt cục bộ luôn thích hợp hơn cài đặt toàn cầu.
./node_modules/.bin/gulp
.
gulp
và coffee
vì vậy các lệnh hoạt động từ gốc dự án nút của tôi (ví dụ. alias gulp="node_modules/.bin/gulp"
). Bằng cách này, các lệnh dễ sử dụng nếu cần và xung đột phiên bản toàn cầu / cục bộ không xảy ra.
gulp
, nó sẽ cho tôi thông báo lỗi sau Local gulp not found in ...
. Theo như tôi hiểu, trước tiên nó nên nhìn vào node_modules cục bộ và nếu không tìm thấy thì nên xem xét các mô-đun được cài đặt trên toàn cầu, phải không? Cảm ơn!
TLDR; Đây là lý do :
Lý do điều này hoạt động là vì
gulp
cố gắng chạygulpfile.js
phiên bản cài đặt cục bộ của bạngulp
, xem tại đây . Do đó lý do cho một cài đặt toàn cầu và địa phương của gulp.
Về cơ bản, khi bạn cài đặt gulp
cục bộ, tập lệnh không nằm trong bạn PATH
và vì vậy bạn không thể chỉ cần gõ gulp
và mong đợi trình bao tìm thấy lệnh. Bằng cách cài đặt nó trên toàn cầu, gulp
tập lệnh sẽ vào trong thư mục chung của bạn PATH
vì node/bin/
rất có thể là trên đường dẫn của bạn.
Để tôn trọng các phụ thuộc cục bộ của bạn, gulp
sẽ sử dụng phiên bản cài đặt cục bộ của bạn để chạy gulpfile.js
.
gulp
gói cài đặt toàn cầu của bạn là cần thiết để đưa node_modules/.bin/gulp
vào đường dẫn. Dung lượng rẻ nhưng vứt bỏ MB để mô phỏng một liên kết tượng trưng là sự chậm chạp thuần túy của IMO.
Bạn có thể liên kết cài đặt toàn cầu gulp
với
npm link gulp
npm link
.
Câu hỏi " Tại sao chúng ta cần cài đặt gulp trên toàn cầu và cục bộ? " Có thể được chia thành hai câu hỏi sau:
Tại sao tôi cần cài đặt gulp cục bộ nếu tôi đã cài đặt nó trên toàn cầu?
Tại sao tôi cần cài đặt gulp trên toàn cầu nếu tôi đã cài đặt cục bộ?
Một số người khác đã cung cấp câu trả lời tuyệt vời cho các câu hỏi luận án một cách cô lập, nhưng tôi nghĩ sẽ có ích khi củng cố thông tin trong một câu trả lời thống nhất.
Tại sao tôi cần cài đặt gulp cục bộ nếu tôi đã cài đặt nó trên toàn cầu?
Lý do để cài đặt gulp cục bộ bao gồm một số lý do:
Tại sao tôi cần cài đặt gulp trên toàn cầu nếu tôi đã cài đặt cục bộ?
Để tránh cài đặt cục bộ, bạn có thể sử dụng npm link [package]
, nhưng lệnh liên kết cũng như install --global
lệnh dường như không hỗ trợ--save-dev
tùy chọn này có nghĩa là cách nào dễ dàng để cài đặt gulp trên toàn cầu và sau đó dễ dàng thêm bất kỳ phiên bản nào tệp pack.json cục bộ của bạn.
Cuối cùng, tôi tin rằng sẽ có ý nghĩa hơn khi có tùy chọn sử dụng các mô-đun toàn cầu để tránh phải sao chép cài đặt các công cụ phổ biến trong tất cả các dự án của bạn, đặc biệt là trong trường hợp các công cụ phát triển như grunt, gulp, jshint, v.v. có vẻ như bạn cuối cùng đã chiến đấu với các công cụ một chút khi bạn chống lại hạt lúa.
Về mặt kỹ thuật, bạn không cần phải cài đặt nó trên toàn cầu nếu node_modules
thư mục trong bản cài đặt cục bộ của bạn nằm trong PATH
. Nói chung đây không phải là một ý tưởng tốt.
Hoặc nếu npm test
tham chiếu gulp
thì bạn chỉ có thể gõ npm test
và nó sẽ chạy gulp cục bộ.
Tôi chưa bao giờ cài đặt gulp trên toàn cầu - Tôi nghĩ đó là hình thức xấu.
Tôi không chắc vấn đề của chúng tôi có liên quan trực tiếp đến việc cài đặt gulp chỉ cục bộ hay không. Nhưng chúng tôi đã phải cài đặt một loạt các phụ thuộc của chúng ta. Điều này dẫn đến một gói.json "khổng lồ" và chúng tôi không chắc liệu đó có thực sự là một ý tưởng tuyệt vời để chỉ cài đặt gulp cục bộ hay không. Chúng tôi đã phải làm như vậy vì môi trường xây dựng của chúng tôi. Nhưng tôi không khuyên bạn nên cài đặt gulp không toàn cầu nếu nó không thực sự cần thiết. Chúng tôi đã đối mặt với các vấn đề tương tự như được mô tả trong các điều sau đây bài đăng trên blog
Không có vấn đề nào trong số này phát sinh đối với bất kỳ nhà phát triển nào của chúng tôi trên các máy cục bộ của họ bởi vì tất cả họ đều đã cài đặt gulp trên toàn cầu. Trên hệ thống xây dựng, chúng tôi đã có các vấn đề được mô tả. Nếu ai đó quan tâm tôi có thể đi sâu hơn vào vấn đề này. Nhưng ngay bây giờ tôi chỉ muốn đề cập rằng đó không phải là một cách dễ dàng để cài đặt gulp chỉ cục bộ.
Chỉ vì tôi chưa thấy nó ở đây, nếu bạn đang dùng MacOS hoặc Linux, tôi khuyên bạn nên thêm cái này vào PATH của bạn (trong bashrc của bạn, v.v.):
node_modules/.bin
Với mục nhập đường dẫn tương đối này, nếu bạn đang ngồi trong thư mục gốc của bất kỳ dự án nút nào, bạn có thể chạy bất kỳ công cụ dòng lệnh nào (eslint, gulp, v.v.) mà không phải lo lắng về "cài đặt toàn cầu" hoặc npm run
v.v.
Khi tôi đã làm điều này, tôi chưa bao giờ cài đặt một mô-đun trên toàn cầu.