Làm thế nào để xác định các mô-đun cục bộ như phụ thuộc gói npm


267

Tôi có một ứng dụng có tập hợp phụ thuộc thông thường trên các mô-đun của bên thứ ba (ví dụ: 'express') được chỉ định trong tệp pack.json theo các phụ thuộc. Ví dụ

"express"     : "3.1.1"

Tôi muốn cấu trúc mã của riêng mình theo mô-đun và có một bộ các mô-đun cục bộ (có nghĩa là trên hệ thống tệp tôi hiện đang ở) được cài đặt bởi gói.json. Tôi biết rằng tôi có thể cài đặt một mô-đun cục bộ bằng cách chạy:

npm install path/to/mymodule

Tuy nhiên, tôi không biết làm thế nào để thực hiện điều này thông qua cấu trúc phụ thuộc của gói.json. Sử dụng --savetùy chọn trong lệnh này chỉ đơn giản là đưa "mymodule": "0.0.0"vào gói.json của tôi (không tham chiếu vị trí filepath). Nếu sau đó tôi gỡ bỏ phiên bản đã cài đặt khỏi node_modules và thử cài đặt lại từ gói.json thì không thành công (vì nó tìm "mymodule" trong sổ đăng ký trung tâm và không tìm kiếm cục bộ).

Tôi chắc chắn đó là một cách để nói "dependencies": {}cấu trúc mà tôi muốn nó được cài đặt từ một đường dẫn hệ thống tệp, nhưng không biết làm thế nào.

Bất cứ ai khác có vấn đề này? Cảm ơn.


1
Một câu hỏi thực sự tốt. Thật buồn khi nhận ra rằng không có tính năng tương đương với package.jsonnhững gì chúng ta có trong Gemfiles.
Jarl

Câu trả lời:


405

npm install bây giờ hỗ trợ này

npm install --save ../path/to/mymodule

Để làm việc này mymodulephải được cấu hình như một mô-đun riêng package.json. Xem phần Tạo mô-đun NodeJS .

Kể từ npm 2.0, các phụ thuộc cục bộ được hỗ trợ nguyên bản. Xem câu trả lời của danilopopeye cho một câu hỏi tương tự . Tôi đã sao chép câu trả lời của anh ấy ở đây vì câu hỏi này xếp hạng rất cao trong kết quả tìm kiếm trên web.

Tính năng này đã được triển khai trong phiên bản 2.0.0 của npm. Ví dụ:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Bất kỳ đường dẫn nào sau đây cũng hợp lệ:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

đồng bộ hóa cập nhật

Kể từ khi npm installsao chép mymodulevào node_modules, thay đổi trongmymodule nguồn của dự án sẽ không tự động được nhìn thấy bởi dự án phụ thuộc.

Có hai cách để cập nhật dự án phụ thuộc với

  • Cập nhật phiên bản mymodulevà sau đó sử dụngnpm update : Như bạn có thể thấy ở trên, mục package.json"phụ thuộc" không bao gồm một công cụ xác định phiên bản như bạn thấy cho các phụ thuộc thông thường. Thay vào đó, đối với phụ thuộc địa phương, npm updatechỉ cố gắng để đảm bảo mới nhất phiên bản được cài đặt, như được xác định bởi mymodule's package.json. Xem câu trả lời của chriskelly cho vấn đề cụ thể này .

  • Cài đặt lại bằng cách sử dụng npm install. Điều này sẽ cài đặt bất cứ thứ gì ở mymoduleđường dẫn nguồn, ngay cả khi nó cũ hơn hoặc có một nhánh thay thế được kiểm tra, bất cứ điều gì.


2
Điều này làm việc cho tôi. (Tôi vừa thực hiện một con đường tương đối địa phương như"mymodule":"file:mymoduledir"
Don Rhummy

72
npm install --save ../my-local-repo
Ivan Rave

15
Và làm thế nào để sử dụng nó trong dự án? Tôi đang cố gắng gọi nó như thế import { HelloWorld } from "my-test-lib";, nhưng tôi nhận được lỗi "Không thể tìm thấy mô-đun". Xin vui lòng, hãy xem stackoverflow.com/questions/46818083/ từ
Vitalii Vasylenko

6
@LucioMollinedo bạn có thể chia sẻ cú pháp về cách bạn nhập mô-đun cục bộ không? Cũng như Vitallii, tôi đang gặp lỗi "Không thể mô-đun tốt" vớiimport { HelloWorld } from "my-test-lib";
Stan James

7
Điều này không hoạt động giống như tham chiếu một gói vì các phụ thuộc sẽ không được cài đặt cho dự án
Glass Cannon

44

Xem: Sự phụ thuộc cục bộ trong pack.json

Có vẻ như câu trả lời là npm link: https://docs.npmjs.com/cli/link


5
thực sự liên kết npm sẽ chỉ tạo các liên kết tượng trưng và sẽ không sửa đổi gói.json để thêm phụ thuộc cục bộ
Sebastien H.

1
Nhưng nếu nó không phải là một symlinkdự án mẹ sẽ biết xây dựng lại như thế nào khi sự phụ thuộc đã hoàn thành việc xây dựng?
Jamie Hutber

11

Cuối cùng tôi không thể tìm thấy một cách gọn gàng vì vậy tôi đã tạo một thư mục được gọi local_modulesvà sau đó thêm bashscript này vào gói.json trong scripts-> cài đặt sẵn

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done

5

Sau khi vật lộn nhiều với npm link lệnh (giải pháp được đề xuất để phát triển các mô đun cục bộ mà không xuất bản chúng vào sổ đăng ký hoặc duy trì một bản sao riêng trong thư mục node_modules), tôi đã xây dựng một mô-đun npm nhỏ để giải quyết vấn đề này.

Việc sửa chữa đòi hỏi hai bước dễ dàng .

Đầu tiên:

npm install lib-manager --save-dev

Thứ hai, thêm cái này vào package.json:

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

Thêm chi tiết tại https://www.npmjs.com/package/lib-manager . Hy vọng nó sẽ giúp được ai đó.


0

Nếu đơn giản là có thể xuất bản các mô-đun của bạn được cài đặt sẵn trong node_modules cùng với các tệp khác của bạn, bạn có thể làm như thế này:

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

Bạn cũng có thể muốn lưu trữ mô-đun của mình trên git và nói với gói cha.j.j của bạn để cài đặt phần phụ thuộc từ git: https://npmjs.org/doc/json.html#Git-URLs-as-Dependencies


5
Thật không may, điều đó sẽ liên quan đến node_modules có các mô đun cục bộ của tôi và các mô đun đóng góp / bên thứ ba được cài đặt từ sổ đăng ký (ví dụ: kết nối) trong cùng thư mục. Bên cạnh việc khó hiểu từ góc độ Git / VCS (nghĩa là phải bỏ qua tất cả trong node_modules ngoại trừ những thứ tôi tạo ra), đó cũng là một thực tiễn tồi (những thứ tôi đã viết và không được xuất bản nên tách biệt với những thứ khác đã được viết và xuất bản ).
Sam Adams

Khi tôi thêm một mô-đun cục bộ, sau đó thực hiện các thay đổi mà ứng dụng chính của tôi không nhìn thấy. Tại sao điều này là trường hợp?
Mark Tyers
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.