Chỉ định đường dẫn đến node_modules trong package.json


96

Có cách nào để di chuyển thư mục node_modules trong một ứng dụng, giả sử / nhà cung cấp / node_modules giống như bower làm với tệp bowerrc không? Tôi nghĩ rằng nó có thể được chỉ định trong package.json nhưng dường như tôi không thể tìm ra giải pháp. Sự giúp đỡ của bạn được đánh giá rất cao.



@blunderboy cảm ơn vì liên kết. Thật là điên rồ khi không có cách nào dễ dàng hơn để làm điều đó. Ồ tốt.
sturoid

26
Tôi không chắc tại sao bạn lại chấp nhận một câu trả lời rõ ràng không trả lời câu hỏi của bạn. Bạn hỏi làm thế nào để thiết lập đường dẫn đến node_modules trongpackage.json , và câu trả lời xShirase của đơn giản là không cung cấp một cách để làm điều đó.
Mark Amery,

4
Anh ấy có lẽ đã chấp nhận câu trả lời bởi vì đây rất rõ ràng là một vấn đề XY và một giải pháp thay thế tốt hơn là "xin lỗi, điều đó không thể."
Jake Holzinger

Câu trả lời:


58

vâng, bạn có thể, chỉ cần đặt biến env NODE_PATH:

export NODE_PATH='yourdir'/node_modules

Theo doc gia:

Nếu biến môi trường NODE_PATH được đặt thành danh sách các đường dẫn tuyệt đối được phân tách bằng dấu hai chấm, thì nút sẽ tìm kiếm các đường dẫn đó cho các mô-đun nếu chúng không được tìm thấy ở nơi khác. (Lưu ý: Trên Windows, NODE_PATH được phân tách bằng dấu chấm phẩy thay vì dấu hai chấm.)

Ngoài ra, nút sẽ tìm kiếm ở các vị trí sau:

1: $ HOME / .node_modules

2: $ HOME / .node_libraries

3: $ PREFIX / lib / nút

Trong đó $ HOME là thư mục chính của người dùng và $ PREFIX là node_prefix được cấu hình của nút.

Đây hầu hết là vì lý do lịch sử. Chúng tôi rất khuyến khích bạn đặt cục bộ các phụ thuộc của mình trong các thư mục node_modules. Chúng sẽ được tải nhanh hơn và đáng tin cậy hơn.

Nguồn


1
Điều đó thật tuyệt. Vì vậy, trong trường hợp của tôi, nơi tôi có node_modules cục bộ cho mỗi ứng dụng mà tôi đang xây dựng, tôi có thực hiện việc xuất đó trong một tệp js trong dự án không?
sturoid

3
không, nó là một biến môi trường, nó được thiết lập ở cấp hệ thống. Vì vậy, bạn phải nhập nó vào thiết bị đầu cuối của bạn. biến env được truy cập trong một ứng dụng nút trongprocess.env
xShirase

Hmmm nghe hay đấy. Tôi sẽ phải xem xét nó một số chi tiết. Cảm ơn đã giúp đỡ.
sturoid

112
Tôi không thực sự nghĩ rằng đây là câu trả lời cho câu hỏi: Anh ấy đang yêu cầu một thuộc tính trong package.json để đặt một đường dẫn cho LOCAL (cấp ứng dụng) npm-Packages. Câu trả lời này cho anh ta biết cách anh ta có thể di chuyển các gói đã cài đặt TOÀN CẦU (-g) vào một thư mục khác.
David Losert

2
@IsmailIqbal Xin lỗi, tôi mới thấy bình luận của bạn. Đã hai năm trong thế giới NPM và chúng tôi đã có một bước nhảy vọt với bộ nhớ đệm, sợi hoặc thậm chí là npm5, webpack ... Tôi muốn nói rằng việc xử lý node_module ngày nay là cách tốt hơn. Trong trường hợp của bạn, tôi chỉ cần thực hiện "cài đặt npm" ở tất cả các vị trí - vì npm cache đã được cài đặt các gói, nó giống như sao chép thủ công mà không cần chi phí.
David Losert

28

Tóm lại: Điều đó là không thể và có vẻ như nó sẽ không bao giờ được hỗ trợ (xem tại đây https://github.com/npm/npm/issues/775 ).

Có một số cách giải quyết khó hiểu khi sử dụng CLI hoặc ENV-Variables (xem câu trả lời được chọn hiện tại), .npmrc-Config-Files hoặc npm link- điểm chung của chúng: Chúng không bao giờ chỉ dành riêng cho dự án, mà luôn là một số loại của globalgiải pháp.

Đối với tôi, không có giải pháp nào trong số đó thực sự sạch vì những người đóng góp cho dự án của bạn luôn cần tạo ra một số cấu hình đặc biệt hoặc có một số kiến ​​thức đặc biệt - họ không thể chỉ npm installvà nó hoạt động.

Vì vậy: Hoặc bạn sẽ phải đặt package.json của mình vào cùng một thư mục mà bạn muốn cài đặt node_modules hoặc sống với thực tế là chúng sẽ luôn ở trong thư mục gốc của dự án của bạn.


16
"Nếu bạn muốn đánh vần" node_modules "theo cách khác, xin lỗi, không thể làm được. Điều đó được tích hợp vào node-core. Thay đổi điều đó tương đương với việc xây dựng một trình quản lý gói hoàn toàn khác." <== làm tốt lắm khi sử dụng các biến mà tôi đoán.
stevedbrown

Một nhận xét từ năm 2019: có vẻ như sợi hỗ trợ ghi đè thư mục mô-đun. Tôi cho là sợi là một công ty quản lý gói hàng mới.
Vanuan

10

Yarn hỗ trợ tính năng này:

# .yarnrc file in project root
--modules-folder /node_modules

Nhưng trải nghiệm của bạn có thể khác nhau tùy thuộc vào gói bạn sử dụng. Tôi không chắc bạn muốn đi vào cái lỗ thỏ đó.


6

Tôi không chắc đây có phải là điều bạn nghĩ hay không, nhưng tôi đã kết thúc câu hỏi này vì tôi không thể cài đặt node_modulesbên trong dự án của mình vì nó được gắn trên hệ thống tệp không hỗ trợ liên kết tượng trưng (một thư mục VM "shared" ).

Tôi đã tìm thấy giải pháp sau:

  1. Sao chép package.jsontệp vào một thư mục tạm thời trên một hệ thống tệp khác
  2. Chạy npm installđến đó
  3. Sao chép node_modulesthư mục kết quả vào lại dự án dir, sử dụng cp -r --dereferenceđể mở rộng liên kết tượng trưng thành các bản sao.

Tôi hy vọng điều này sẽ giúp ích cho những người khác, những người kết thúc câu hỏi này khi tìm cách chuyển node_modulessang một hệ thống tệp khác.

Sự lựa chọn khác

Có một cách giải quyết khác mà tôi đã tìm thấy về sự cố github mà @Charminbear liên kết với , nhưng cách này không hiệu quả gruntvì nó không hỗ trợ NODE_PATHtheo https://github.com/browserify/resolve/issues/136 :

giả sử bạn có /media/sf_sharedvà bạn không thể cài đặt các liên kết tượng trưng trong đó, có nghĩa là bạn không thể thực sự cài đặt npm từ đó /media/sf_shared/myprojectvì một số mô-đun sử dụng liên kết tượng trưng.

  • $ mkdir /home/dan/myproject && cd /home/dan/myproject
  • $ ln -s /media/sf_shared/myproject/package.json (bạn có thể liên kết biểu tượng theo hướng này, chỉ không thể tạo liên kết bên trong / media / sf_shared)
  • $ npm install
  • $ cd /media/sf_shared/myproject
  • $ NODE_PATH=/home/dan/myproject/node_modules node index.js
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.