Sự phụ thuộc cục bộ trong gói.json


452

Tôi muốn làm một cái gì đó như thế này, vì vậy npm installcũng sẽ cài đặt package.jsoncủa ../somelocallibhoặc quan trọng hơn là phụ thuộc của nó.

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}

Câu trả lời:


581

npm> = 2.0.0

Tính năng này đã được triển khai trong phiên bản 2.0.0 của npm. Thí 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

Gói cục bộ sẽ được sao chép vào tiền tố ( ./node-modules).

npm <2.0.0

Đặt somelocallibsự phụ thuộc vào bạn package.jsonnhư bình thường:

"dependencies": {
  "somelocallib": "0.0.x"
}

Sau đó chạy npm link ../somelocallibvà npm sẽ cài đặt phiên bản bạn đang làm việc dưới dạng liên kết tượng trưng .

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

Tham khảo: liên kết (1)


3
Làm thế nào chúng ta có thể hủy liên kết nó?
AtaurRehman Asad

13
Nhược điểm của việc cài đặt các gói cục bộ với "npm link" là bạn nhận được rất nhiều sao chép mô-đun. Khi bạn liệt kê các phụ thuộc của mình bằng "mô-đun: phiên bản" hoặc "mô-đun: git-repo", thuật toán cài đặt npm sẽ tránh cài đặt gói đã được cài đặt trong gói cha. Vì vậy, với "npm link", nếu ứng dụng chính của bạn phụ thuộc vào "async@0.8.0" và tất cả các gói cục bộ của bạn cũng phụ thuộc vào "async@0.8.0", bạn sẽ kết thúc với tất cả các gói cục bộ cài đặt "async@0.8. 0 "thay vì sử dụng cùng một phiên bản" không đồng bộ "được cài đặt của ứng dụng chính. Điều này không xảy ra bằng cách sử dụng "thư mục cài đặt npm".
Pedro Ballesteros

3
@PedroBallesteros bạn có thể sử dụng npm dedupđể khắc phục vấn đề này. npmjs.org/doc/cli/npm-dedupe.html
danilopopeye

4
"Gói cục bộ sẽ được sao chép ..." dường như không phải là trường hợp với phiên bản npm gần đây hơn. Bây giờ, một liên kết tượng trưng được tạo ra.
tsauerwein

2
@danilopopeye Per docs.npmjs.com/cli/install npm install <folder> mô tả cho biết Cài đặt gói trong thư mục dưới dạng liên kết tượng trưng trong dự án hiện tại.
Herman J. Radtke III

211

Bây giờ có thể chỉ định package.jsontrực tiếp đường dẫn cài đặt mô-đun Node cục bộ của bạn . Từ các tài liệu:

Đường dẫn địa phương

Kể từ phiên bản 2.0.0, bạn có thể cung cấp đường dẫn đến thư mục cục bộ có chứa gói. Đường dẫn cục bộ có thể được lưu bằng cách sử dụng npm install -Shoặc npm install --save, sử dụng bất kỳ biểu mẫu nào sau đây:

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

trong trường hợp đó, chúng sẽ được chuẩn hóa thành một đường dẫn tương đối và được thêm vào của bạn package.json. Ví dụ:

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

Tính năng này hữu ích cho phát triển ngoại tuyến cục bộ và tạo các thử nghiệm yêu cầu cài đặt npm khi bạn không muốn truy cập máy chủ bên ngoài, nhưng không nên được sử dụng khi xuất bản các gói lên sổ đăng ký công khai.


23
Trong npm v.3 +, chuẩn hóa là tuyệt đối, không tương đối , vì vậy bạn sẽ thấy một cái gì đó giống như"bar": "file:///home/user/src/foo/bar"
Ron Wertlen

27
Làm cách nào để cập nhật phụ thuộc đường dẫn cục bộ mà không tăng phiên bản?
Bohdan Lyzanets

3
Nhân tiện, điều này gây ra tất cả các loại rắc rối khi và / hoặc nếu bạn cố gắng cập bến ứng dụng nút của mình, vì các node:onbuildhình ảnh tiêu chuẩn chỉ sao chép thư mục hiện tại và do đó bỏ qua mọi thứ ../foo.
donmartin

4
Có cách nào để tích hợp cái này với git + ssh để người ta có thể có một bản sao cục bộ của kho git mà họ npm installtừ hoặc một kho git khác trên mạng LAN không? Khi tôi thử cài đặt ở trên và npm từ git + ssh, nó dường như tìm trong thư mục node_modules và không cố gắng đi qua git + ssh mặc dù đó là cách tôi đang cài đặt gói cấp cao nhất.
Michael

1
Cài đặt công việc. Nhưng theo cách này tôi sẽ nhận được "ERR không tìm thấy" khi cố gắng nhập mô-đun vào dự án của mình.
C4d

87

Điều này làm việc cho tôi.

Đặt phần sau vào tệp pack.json của bạn

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}

4
Cảm ơn đề xuất không yêu cầu sử dụng "npm link"
ItalyPaleAle

Nó được gỡ bỏ .gitignoretrong thư mục mô-đun, được tạo .npmignorevà lần đầu tiên tôi chạy nó đã áp dụng đệ quy 777 trên tất cả các thư mục ngoại trừ node_modules. Nhưng có, nó đã cài đặt các phụ thuộc. Sử dụng phiên bản npm 1.4.14.
L0LN1NJ4

đã sử dụng cái này, nhưng thay vì làm rối với node_modules tôi đã sử dụng app_modules
catalint

1
Tại sao không "dependencies": { "my-own-module": "file:../my-own-module" }?
Bohdan Lyzanets

1
Tôi đồng ý với @Bohdan ở đây. phụ thuộc địa phương sẽ làm điều tương tự chính xác. Ưu điểm của việc sử dụng npm linklà bạn không cần phải thực hiện npm installmỗi lần để cập nhật các phụ thuộc của mình.
froginvasion

30

Nếu bạn muốn tự động hóa thêm điều này, bởi vì bạn đang kiểm tra mô-đun của mình trong kiểm soát phiên bản và không muốn dựa vào các nhà phát triển ghi nhớ liên kết npm, bạn có thể thêm phần này vào phần "script" của gói.json:

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

Điều này cảm thấy vượt quá hacky, nhưng nó dường như "làm việc". Nhận mẹo từ vấn đề npm này: https://github.com/npm/npm/issues/1558#issuecomment-12444454


15
Tại sao postinstallpostupdatethay vì preinstallpreupdate?
đúng

1
Bạn có thể giải thích thêm một chút những gì nó làm. tức là nếu tôi thiết lập một dự án vscode với nhiều thư mục gốc (tức là "không gian làm việc đa gốc"), nó có thể phản ánh các thay đổi trong thư mục mô-đun ngay lập tức cho các dự án đang tiêu thụ không? - Đó có phải là những gì hack này là về?
bvdb

26

Đây là cách bạn sẽ thêm phụ thuộc cục bộ:

npm install file:src/assets/js/FILE_NAME

Thêm nó vào pack.json từ NPM:

npm install --save file:src/assets/js/FILE_NAME

Thêm trực tiếp vào pack.json như thế này:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....

6

Dự án tổng thể

Đây là gói.json bạn sẽ sử dụng cho dự án chính:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

Ở đó, ./somelocalliblà tham chiếu đến thư mục thư viện liên quan đến gói dự án chính.j.j .

Tham khảo: https://docs.npmjs.com/files/package.json#local-paths


Dự án phụ

Xử lý các phụ thuộc thư viện của bạn.

Ngoài việc chạy npm install, bạn sẽ cần phải chạy (cd node_modules/somelocallib && npm install).

Đây là một lỗi đã biết với NPM.

Tham khảo: https://github.com/npm/npm/issues/1341 (tìm kiếm một tài liệu tham khảo cập nhật hơn)


Ghi chú cho Docker

Kiểm tra chủ của bạn package.lockvà của bạn somelocallib/package.lockvào trình quản lý mã nguồn của bạn.

Sau đó, trong Dockerfile của bạn sử dụng:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

Tôi sử dụng dấu ngoặc đơn trong các (cd A && B)cấu trúc của mình để làm cho hoạt động trở nên bình thường.


3

Tôi biết rằng npm install ../somelocallibhoạt động.

Tuy nhiên, tôi không biết liệu cú pháp bạn hiển thị trong câu hỏi có hoạt động từ package.json...

Thật không may, doc dường như chỉ đề cập đến URL như một sự phụ thuộc.

Hãy thử file:///.../...tar.gz, chỉ vào một lib cục bộ được nén ... và cho chúng tôi biết nếu nó hoạt động.


1
Tôi thêm "phụ thuộc": {"somemodule": "tệp: ///./iternal_modules/somemodule"} vào pack.json. Nó không hoạt động. Mã lỗi là "npm ERR! Mã E404".
Jeffrey

2

Điều này làm việc cho tôi: đầu tiên, hãy đảm bảo các thư mục npm có đúng người dùng

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

Sau đó, trong gói.json của bạn liên kết thư mục

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}

2
Liên kết tượng trưng trên Windows là có thể kể từ XP en.wikipedia.org/wiki/NTFS_symbolic_link . Mở dòng lệnh với tư cách quản trị viên, sau đó chạy npm install.
sod

2

Trên thực tế, kể từ npm 2.0, hiện có hỗ trợ các đường dẫn cục bộ (xem tại đây ).


8
Michael Trouw đã đưa ra câu trả lời này một vài tuần trước, vậy tại sao lại trùng lặp?
Dan Dascalescu

2

Tò mò ..... ít nhất là trên Windows (npm của tôi là 3. một cái gì đó) tôi cần phải làm:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

Khi tôi thực hiện, npm install ../module1 --savenó dẫn đến các đường dẫn tuyệt đối và không tương đối theo tài liệu.

Tôi loay hoay thêm một chút nữa và xác định thế ../xxxlà đủ.

Cụ thể, tôi đã kiểm tra các mô-đun nút cục bộ để nói d: \ build \ module1, d: \ build \ module2 và dự án nút (ứng dụng) của tôi trong d: \ build \ nodeApp.

Để 'cài đặt', tôi:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

pack.json của module1 có sự phụ thuộc của "module2": "../module2"; module2 không có phụ thuộc cục bộ; nodeApp có các phụ thuộc "module1": "../module1" và "module2": "../module2".

Không chắc chắn nếu điều này chỉ hoạt động với tôi vì cả 3 thư mục (module1, module2 và nodeApp) đều ở cùng cấp độ đó .......


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.