Làm thế nào để bạn ngăn chặn việc cài đặt các mô-đun NPM của dev devepepencies cho Node.js (pack.json)?


587

Tôi có cái này trong tệp pack.json (phiên bản rút gọn):

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

Tôi đang sử dụng NPM phiên bản 1.1.1 trên Mac 10.6.8.

Khi tôi chạy lệnh sau từ gốc dự án, nó sẽ cài đặt cả dependencies devDependencies :

npm install

Tôi đã có ấn tượng rằng lệnh này đã cài đặt devDependencies:

npm install --dev

Làm thế nào để tôi làm cho nó npm installchỉ cài đặt dependencies(vì vậy môi trường sản xuất chỉ có các mô-đun đó), trong khi một cái gì đó như npm install --devcài đặt cả hai dependenciesdevDependencies?


1
Theo tài liệu, bạn đã đúng, --dev cài đặt các devdeps, nếu không, chỉ có các deps. npmjs.org/doc/json.html . Tôi biết điều này làm việc cho các gói được đặt tên, ít nhất.
mna

1
nếu bạn gặp Câu hỏi này vào năm 2015, --save-dev thực hiện thủ thuật chính xác như đã hỏi trong Câu hỏi này.
Anand

1
Câu trả lời này stackoverflow.com/a/22004559/3718119 đưa ra một lời giải thích tốt đẹp để sự khác biệt giữa dependenciesdevDependenciesvà khi mỗi người trong số họ được sử dụng.
quasoft

Câu trả lời:


844

Các npm installlệnh sẽ cài đặt devDependenciescùng khác dependencieskhi chạy bên trong một thư mục gói, trong một môi trường phát triển (mặc định).

Sử dụng npm install --only=prod(hoặc --only=production) để chỉ cài đặt dependenciesvà không devDependencies,phụ thuộc vào giá trị của NODE_ENVbiến môi trường.

Nguồn: tài liệu npm

Lưu ý: Trước v3.3.0 của npm (2015-08-13), tùy chọn đã được gọi --production, nghĩa là npm install --production.


2
Lý do của Agate có lẽ là để loại bỏ devDependencies để người tiêu dùng cài đặt gói của bạn npm install yourpackage.tgzkhông nhận được devDependencies. Tuy nhiên, đó đã là trường hợp. Xem câu trả lời của Kevin Cox bên dưới ( stackoverflow.com/a/15826602/825588 ).
Johann

5
npmjs.org/doc/cli/npm-install.html "Theo mặc định, cài đặt npm sẽ cài đặt tất cả các mô-đun được liệt kê dưới dạng phụ thuộc. Với cờ --production, npm sẽ không cài đặt các mô-đun được liệt kê trong devDependencies."
tomByrer

14
Ôi chúa ơi. Tôi hoàn toàn có được NODE_ENV=productiontừ một thứ khác mà tôi đang làm và không thể hiểu được cuộc sống của tôi tại sao npm installkhông cài đặt phụ thuộc. Cảm ơn câu trả lời thấu đáo.
aendrew

1
npm install --dev sẽ chỉ cài đặt phụ thuộc dev
Rustem K

10
Đối với npm 3.3 trở đi: npm cài đặt WARN Cách sử dụng --devtùy chọn không được chấp nhận. Sử dụng --only=devthay thế.
srcspider

232

Tôi cũng gặp phải vấn đề đó! cài đặt npm hơi khó hiểu và các bài đăng trên web tiếp tục mang các cờ -d / - dev như thể có chế độ cài đặt 'phát triển' rõ ràng.

  • npm installsẽ cài đặt cả " phụ thuộc " và " devDependencies "

  • npm install --productionsẽ chỉ cài đặt " phụ thuộc "

  • npm install --devsẽ chỉ cài đặt " devDependencies "


29
CẢNH BÁO: Nếu NODE_ENVđược đặt thành productionvà bạn chạy, npm installnó sẽ không cài đặt phụ thuộc dev. Tôi gặp vấn đề này trong Dockerfile của tôi.
vaughan

1
@vaughan Tôi cũng gặp phải vấn đề này, có thể được giải quyết bằng cách chạy npm --production=false install(mặc dù không chắc điều này có hoạt động cùng với cờ --dev không)
Bavell

138

Tùy chọn mới là:

npm install --only=prod

Nếu bạn chỉ muốn cài đặt devDependencies:

npm install --only=dev

1
Điều này trả lời ngược lại với câu hỏi. OP đang hỏi làm thế nào KHÔNG cài đặt devDependencies.
musicin3d

2
bạn đã đúng một phần @ musicin3d, đó là lý do tại sao ở phần đầu tiên tôi đã trả lời cách cài đặt phụ thuộc chỉ prod và phần thứ hai làm thế nào để cài đặt phụ thuộc dev, chỉ trong trường hợp.
Cloxure

5
Này đó. Tôi đã để lại nhận xét đó trước khi @ user1614572 thêm phần về --only=prod. Bạn, thưa ngài, là một phần chính xác. ; P
musicin3d

chúng ta có thể bao gồm sự phụ thuộc riêng cho việc triển khai không?
Jeeva Jsb

1
Đó là một nhận xét, không phải là một câu trả lời. Tôi không đi kiểm tra tất cả các ý kiến ​​của tôi định kỳ. Tôi chưa bao giờ thấy mọi người cập nhật ý kiến từ nhiều năm trước. Về cơ bản, bạn đã đến đây để chỉ trích rằng tôi đặt một năm cho nhận xét của mình. Tôi sẽ không trả lời thêm. Hãy vui vẻ troll người khác.
Jacques ャ ッ

47

Nếu bạn đọc POST này vào năm 2016, vui lòng đạt được những gì bạn muốn bằng cách sử dụng

--only={prod[uction]|dev[elopment]} 

đối số sẽ gây ra chỉ devDependencies hoặc chỉ không devDependencies được cài đặt bất kể NODE_ENV.

từ: https://docs.npmjs.com/cli/install


Tại sao viết hoa "POST"? docs.npmjs.com/cli/install rõ tài liệu CẢ HAI --production--only={prod[uction]|dev[elopment]}.
Dan Dascalescu

33

Nếu bạn đã cài đặt tất cả các phụ thuộc của mình và bạn muốn tránh phải tải xuống lại các gói sản xuất từ ​​NPM, bạn chỉ cần gõ:

npm prune --production

Điều này sẽ loại bỏ các phụ thuộc dev của bạn khỏi node_modulesthư mục của bạn , rất hữu ích nếu bạn đang cố gắng tự động hóa một quy trình hai bước như

  1. Webpack dự án của tôi, sử dụng phụ thuộc dev
  2. Xây dựng hình ảnh Docker chỉ sử dụng các mô-đun sản xuất

Chạy npm pruneở giữa sẽ giúp bạn không phải cài đặt lại mọi thứ!


19

Khi sử dụng "cài đặt npm", các mô-đun được tải và có sẵn trong ứng dụng của bạn bất kể chúng là "devDependencies" hay "phụ thuộc". Tổng hợp ý tưởng này: mọi thứ mà gói.json của bạn định nghĩa là một phụ thuộc (bất kỳ loại nào) được cài đặt vào node_modules.

Mục đích cho sự khác biệt giữa các phụ thuộc / devDependencies / tùy chọnDependencies là những gì người tiêu dùng mã của bạn có thể làm w / npm để cài đặt các tài nguyên này.

Theo tài liệu: https://npmjs.org/doc/json.html ...

Nếu ai đó đang có kế hoạch tải xuống và sử dụng mô-đun của bạn trong chương trình của họ, thì có lẽ họ không muốn hoặc không cần tải xuống và xây dựng khung kiểm tra hoặc tài liệu bên ngoài mà bạn sử dụng.

Trong trường hợp này, tốt nhất là liệt kê các mục bổ sung này trong hàm băm devDependencies.

Những thứ này sẽ được cài đặt bất cứ khi nào cờ cấu hình --dev được đặt. Cờ này được đặt tự động khi thực hiện liên kết npm hoặc khi thực hiện cài đặt npm từ thư mục gốc của gói và có thể được quản lý như mọi thông số cấu hình npm khác. Xem cấu hình (1) để biết thêm về chủ đề.

Tuy nhiên, để giải quyết câu hỏi này, nếu bạn muốn CHỈ cài đặt "phụ thuộc" bằng cách sử dụng npm, lệnh sau là:

npm install --production

Điều này có thể được xác nhận bằng cách xem cam kết Git đã thêm bộ lọc này (cùng với một số bộ lọc khác [được liệt kê bên dưới] để cung cấp chức năng này).

Các bộ lọc thay thế có thể được sử dụng bởi npm:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@dmarr thử sử dụng cài đặt npm - sản xuất


16

npm sẽ cài đặt phụ thuộc dev khi cài đặt từ bên trong một gói (nếu có package.jsontrong thư mục hiện tại). Nếu nó đến từ một vị trí khác (npm registry, git repo, vị trí khác trên hệ thống tập tin) thì nó chỉ cài đặt các phụ thuộc.


Bạn có thể vui lòng cải cách? Tôi nghĩ rằng bạn đã mắc lỗi trong ngoặc đơn của mình, tôi nghĩ rằng bạn đã quên đóng nó sớm hơn và cuộc rượt đuổi của bạn không có ý nghĩa gì với tôi (người nói tiếng Anh không phải là người bản xứ). Nhận xét của Johann dưới câu trả lời của Rohan Singh đã chỉ cho tôi xem xét câu trả lời của bạn (vì nghi ngờ của tôi hoàn toàn giống với nghi ngờ của mã não), và không thành công. Tôi vẫn không hiểu nó như thế nào npm install some-modulesẽ không cài đặt phụ thuộc dev some-module.
Rafael Eyng

Cảm ơn, đã sửa. Tôi không hiểu phần còn lại của câu hỏi của bạn.
Kevin Cox

3

Tôi đã thấy rằng, khi cố gắng cài đặt phụ thuộc dev cho gói chứa addon nút, bạn không thể tránh xây dựng addon khi chạy npm install --dev ngay cả khi bạn chỉ muốn cài đặt devDependencies. Vì vậy, tôi đã phải đi lại khoảng npm:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

Hoặc, tốt hơn (và ngắn gọn hơn),

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install

3

Sử dụng npm install packageName --saveđiều này sẽ thêm gói trong phụ thuộc , nếu bạn sử dụng npm install packageName --save-devthì nó devDependencies .

npm install packageName --save-devnên được sử dụng để thêm các gói cho mục đích phát triển. Giống như thêm các gói TDD (Chai, mocha, v.v.). Được sử dụng trong phát triển và không sản xuất.


OP không gặp vấn đề trong việc tiết kiệm phụ thuộc package.jsonnhưng một khi các phụ thuộc này đã được lưu , thì làm thế nào để ép buộc npmchỉ cài đặt một loại phụ thuộc cụ thể. Khi tôi đọc câu trả lời của bạn ở đây, tôi đã không học được bất cứ điều gì giúp giải quyết vấn đề do OP đặt ra.
Louis

3

Điều đáng nói là bạn có thể sử dụng NODE_ENVbiến môi trường để đạt được kết quả tương tự. Đặc biệt hữu ích nếu bạn đang chứa ứng dụng Node của mình (ví dụ Docker).

NODE_ENV=production npm install

Đoạn mã trên sẽ cài đặt tất cả các phụ thuộc của bạn trừ các dev (tức là devDependencies).

nếu bạn cần sử dụng các biến môi trường trong Dockerfilethông tin của bạn có thể được tìm thấy ở đây .

Biến môi trường rất dễ ghi đè bất cứ khi nào cần (ví dụ: nếu bạn muốn chạy bộ kiểm tra của mình, hãy nói trên Travis CI). Nếu đó là trường hợp bạn có thể làm một cái gì đó như thế này:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

Tài liệu NPM tại đây

sản xuất

  • Mặc định: sai
  • Loại: Boolean Đặt thành true để chạy trong chế độ "sản xuất".

    1. devDependencies không được cài đặt ở cấp cao nhất khi chạy cài đặt npm cục bộ mà không có bất kỳ đối số nào.
    2. Đặt NODE_ENV = "sản xuất" cho các tập lệnh vòng đời.

Hạnh phúc container =)


3

Tôi đề nghị sử dụng npm ci. Nếu bạn muốn chỉ cài đặt các gói cần thiết cho sản xuất (như bạn đã viết - không có devDependencies) thì:

npm ci --only=production

hoặc là

NODE_ENV=production npm ci

Nếu bạn thích oldschool npm installthì:

npm install --production

hoặc là

NODE_ENV=production npm install

Đây là câu trả lời tốt tại sao bạn nên sử dụng npm ci.


Thật tuyệt, nó cũng hoạt động npm citốt chứ không chỉ npm install!
Klesun

2

Cần thêm vào câu trả lời được chọn: Hiện tại, npm installtrong một thư mục gói (có chứa package.json) sẽ cài đặt devDependencies, trong khi npm install -gsẽ không cài đặt chúng.


7
Có, -gsẽ không cài đặt devDependencies, nhưng nó sẽ cài đặt các gói trên toàn cầu, thường không phải là kết quả dự định.
Bardi Harborow

0

npm install --productionlà cách đúng để cài đặt các mô-đun nút được yêu cầu cho sản xuất. Kiểm tra tài liệu để biết thêm chi tiết


-1

Bây giờ có một vấn đề, nếu bạn có gói-lock.json với npm 5+. Bạn phải loại bỏ nó trước khi sử dụng npm install --production.


-1
npm install --dev will install dev dependencies

Và, theo câu hỏi chỉ cài đặt phụ thuộc, lệnh sau sẽ giúp

npm install --prod will install dependencies
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.