Tại sao chúng ta cần cài đặt gulp trên toàn cầu và cục bộ?


292

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?


12
Trang "Bắt đầu" của dự án cũng nói điều tương tự. (Cũng không nói lý do tại sao.)
TJ Crowder

11
Tôi ước npm có thể sử dụng gói phụ thuộc được cài đặt trên toàn cầu, cùng phiên bản với gói cục bộ. 5 MB nội dung glup cho mỗi thư mục dự án: /
Ciantic

@Ciantic Không bảo đảm, nhưng ... stackoverflow.com/a/25879563/444255
Frank Nocke 2/2/2016

Câu trả lời:


238

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.

npm 5.2+

Các npxtiện ích đi kèm với npm 5.2giả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 .

npm <5.2

Khi được sử dụng trong một scripttrường của gói.json của bạn, npmtìm kiếm node_modulescô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 testsau đó 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ì sudokhông cần thiết. Điều đó cũng có nghĩa là gulpsẽ đượ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.

Phụ lục:

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.


3
Có nhưng những gì khi bạn không có truy cập internet? Làm thế nào bạn có thể sử dụng gulp nếu nó không được cài đặt toàn cầu?
IGRACH

3
@IGRACH Kịch bản trên không sử dụng kết nối internet. Nếu bạn muốn làm điều tương tự mà không sử dụng trường tập lệnh trong pack.json, thì hãy sử dụng ./node_modules/.bin/gulp.
qubyte

1
Tôi đã xác định các bí danh cho gulpcoffeevì 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.
vesse

Cảm ơn @qubyte! Tôi nghĩ rằng cài đặt nó tại địa phương là một thực hành tốt nói chung. Tôi có thêm một câu hỏi để hy vọng bạn có thể giúp tôi giải tỏa đầu óc. Tôi đã thử cài đặt nó trên toàn cầu như tài liệu của Gulp đề xuất mà không cài đặt cục bộ. Vì vậy, khi tôi cố gắng chạy 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!
yeelan 8/2/2015

1
Đã thêm một phụ lục. Hy vọng rằng bao gồm sự kỳ lạ của ngụm.
qubyte

82

TLDR; Đây là lý do :

Lý do điều này hoạt động là vì gulpcố gắng chạy gulpfile.jsphiên bản cài đặt cục bộ của bạn gulp, 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 gulpcục bộ, tập lệnh không nằm trong bạn PATHvà vì vậy bạn không thể chỉ cần gõ gulpvà 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, gulptập lệnh sẽ vào trong thư mục chung của bạn PATHnode/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, gulpsẽ sử dụng phiên bản cài đặt cục bộ của bạn để chạy gulpfile.js.


1
~ / bin là một quy ước Unix cho các nhị phân cho mỗi người dùng và theo mặc định trong PATH trên nhiều HĐH. gulp sẽ có thể liên kết nhị phân của nó từ đó.
mikemaccana

2
Nói cách khác, gulpgói cài đặt toàn cầu của bạn là cần thiết để đưa node_modules/.bin/gulpvà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.
ntd

79

Bạn có thể liên kết cài đặt toàn cầu gulpvới

npm link gulp

1
Tôi biết rằng tốt nhất là sử dụng cài đặt cục bộ, nhưng có thể có trường hợp bạn không thể cài đặt nó hoặc chỉ không muốn (hãy tưởng tượng rằng máy chủ CI chuyên dụng của bạn đã cài đặt trên toàn cầu và bạn đang cài đặt lại trên mỗi cam kết) . Dù sao, +1 để đề cập npm link.
gion_13

1
Tôi thấy những gì bạn đã làm ở đó. Thật khéo léo.
đào sâu

Điều này không cố gắng trả lời câu hỏi
mikemaccana

1
Không, nó chỉ vô hiệu hóa nó.
Berislav Lopac

67

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:

  1. 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?

  2. 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:

  1. Bao gồm các phụ thuộc của dự án của bạn cục bộ đảm bảo phiên bản gulp (hoặc các phụ thuộc khác) được sử dụng là phiên bản dự định ban đầu.
  2. Nút không xem xét các mô-đun toàn cầu theo mặc định khi sử dụng request () (mà bạn cần bao gồm gulp trong tập lệnh của mình). Cuối cùng, điều này là do đường dẫn đến các mô-đun toàn cầu không được thêm vào NODE_PATH theo mặc định.
  3. Theo nhóm phát triển Node, các mô đun cục bộ tải nhanh hơn. Tôi không thể nói lý do tại sao, nhưng điều này dường như có liên quan nhiều hơn đến việc sử dụng nút trong sản xuất (tức là phụ thuộc thời gian chạy) so với phát triển (tức là phụ thuộc dev). Tôi cho rằng đây là một lý do chính đáng vì một số người có thể quan tâm đến bất kỳ lợi thế tốc độ nhỏ nào đạt được khi tải các mô đun cục bộ so với toàn cầu, nhưng hãy thoải mái nâng cao lông mày của bạn vì lý do này.

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ộ?

  1. Lý do để cài đặt gulp trên toàn cầu thực sự chỉ là sự tiện lợi khi có thể thực thi gulp tự động được tìm thấy trong đường dẫn hệ thống của bạn.

Để 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 --globallệ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.


7
+1 vì là người đầu tiên trên toàn bộ internet chỉ ra rằng có hai điểm cho câu hỏi. Hầu hết mọi người ở khắp mọi nơi chỉ trả lời "Tại sao tôi cần cài đặt gulp trên toàn cầu nếu tôi đã cài đặt nó cục bộ?" khi điều tôi muốn biết là "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?".
Nathan JB

10
Thực tế là câu hỏi này cần lời giải thích công phu như vậy có nghĩa là đây đơn giản không phải là một cách làm việc rất logic. Việc cài đặt cùng một công cụ lặp đi lặp lại cho mỗi dự án là không cần thiết.
Kokodoko

4
Câu trả lời của bạn rất đẹp vô cảm. Của tôi sẽ có 80% lời thề, vì điều này dường như thật ngu ngốc. Từ góc độ công cụ, lý thuyết cài đặt cục bộ có thể đúng nhưng từ góc độ hệ điều hành và quan điểm của người quản lý gói, điều này thật điên rồ, tôi không thể tìm được từ nào cho nó. Những kẻ làm NPM / gulp dùng thuốc gì?!? Nếu bất kỳ ai không đồng ý, vui lòng đọc cách quản lý gói hệ thống như dpkg, yum, pacman và co. công việc.
JepZ

2
@JepZ Nó chỉ là một ngụm siêu kỳ lạ, không có gì trong nút hoặc npm buộc điều này. Và việc giữ các phiên bản cụ thể của gulp trong dự án chỉ có ý nghĩa nếu những kẻ ham chơi phá vỡ các phiên bản vá một cách thường xuyên hoặc một cái gì đó, các công cụ xây dựng khác thường là một bản cài đặt toàn cầu. Nhưng ah tốt. Chỉ ở đây để chửi thề.
Stoffe

2
Bây giờ nó thực sự không phải là vấn đề vì cộng đồng đã chuyển sang chỉ sử dụng sợi :)
Derek Greer

8

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_modulesthư 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 gulpthì bạn chỉ có thể gõ npm testvà 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.


3
Cách tiếp cận tốt hơn là đặt nó vào con đường của bạn là sử dụng các tập lệnh NPM
Jay

2

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ộ.


Vâng, xin vui lòng, đi sâu hơn vào vấn đề này.
kenorb

1

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 runv.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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.