Cài đặt một mô-đun cục bộ bằng cách sử dụng npm?


419

Tôi có một repo mô-đun tải xuống, tôi muốn cài đặt nó cục bộ, không phải trên toàn cầu trong một thư mục khác?

Một cách dễ dàng để làm điều này là gì?

Câu trả lời:


481

Từ tài liệu liên kết npm :

Trong thư mục mô-đun cục bộ:

$ cd ./package-dir
$ npm link

Trong thư mục của dự án để sử dụng mô-đun:

$ cd ./project-dir
$ npm link package-name

Hoặc trong một lần sử dụng các đường dẫn tương đối:

$ cd ./project-dir
$ npm link ../package-dir

Điều này tương đương với việc sử dụng hai lệnh trên dưới mui xe.


14
Đây là cách tiếp cận lành mạnh duy nhất tôi từng thấy cho đến nay - tại sao npm phải quá tối nghĩa / khó hiểu w. Liên quan đến việc tạo một gói cục bộ, cài đặt nó và sau đó sử dụng nó, tôi không biết ... liên kết hoạt động, (và tuyệt vời của nó), nhưng thuật ngữ này khá khó hiểu.
smaudet

6
@Rich Apodaca, cảm ơn vì liên kết doc. Nó không đề cập đến việc hoàn tác quá trình. Có vẻ như tất cả những gì nó làm là tạo liên kết tượng trưng, ​​vì vậy tôi có thể loại bỏ chúng như bình thường không?
Tyler Collier

1
@TylerCollier npm unlink dường như là stackoverflow
Apodaca phong phú

1
Chỉ cần một lưu ý, nếu bạn sử dụng Angular2 (hoặc có thể các ứng dụng khác?), Có một số tiếng vang xung quanh liên kết npm là nguyên nhân gốc rễ của loại vấn đề cụ thể. Ví dụ ở đâyđây
Hạt đậu đỏ

4
Tuy nhiên, hãy nhớ rằng npm linksẽ tạo ra một ví dụ thứ hai của các phụ thuộc bên ngoài. Vì vậy, nếu bạn có gói A cần B và C, B cần C. liên kết B sẽ khiến ứng dụng A có hai phiên bản C.
user2167582

422

bạn chỉ cần cung cấp một <folder>đối số cho npm install, đối số sẽ trỏ đến thư mục cục bộ thay vì tên gói:

npm install /path

5
Không giống như liên kết, điều này sử dụng .npmignore.
Camille Wintz

30
@bithavoc Ít nhất là từ npm 5, việc cài đặt một thư mục bây giờ sẽ tạo ra một liên kết tượng trưng, không phải là một bản sao. Xem docs.npmjs.com/cli/install
Frank Tan

3
Tôi đã cố gắng sử dụng theo cách này, nhưng mô-đun của tôi không thể tìm thấy nó ngang hàng.
Witalo Benermo

1
thật tốt rm -rf node_moduleskhi trước và npm installsau khi bạn chạy tập lệnh của câu trả lời.
Renato trở lại

3
@FrankTan Có, nhưng làm thế nào để có được hành vi cũ? Tôi muốn bản sao!
Michael

151

Vì được hỏi và trả lời bởi cùng một người, tôi sẽ thêm một liên kết npm thay thế.

từ tài liệu:

Điều này rất thuận tiện cho việc cài đặt công cụ của riêng bạn, để bạn có thể làm việc với nó và kiểm tra nó lặp đi lặp lại mà không phải liên tục xây dựng lại.

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency

[Chỉnh sửa] Kể từ NPM 2.0, bạn có thể khai báo các phụ thuộc cục bộ trong pack.json

"dependencies": {
    "bar": "file:../foo/bar"
  }

11
Nó có thể không phải là mục đích ban đầu của câu hỏi, nhưng có lẽ đó là điều mà hầu hết những người tìm thấy điều này thông qua google muốn.
Dusty J

1
Câu trả lời này dường như chưa hoàn chỉnh, bạn cần chạy npm linklại thư mục một lần (để tạo liên kết tượng trưng toàn cầu) và sau đó chạy npm link package-nametrong thư mục của dự án (để sử dụng liên kết tượng trưng chung trong dự án của bạn). Câu trả lời dưới đây là câu trả lời đúng.
Thomas Potaire

8
@ThomasPotaire cả hai câu trả lời đều đúng. Nếu bạn xem tài liệu liên kết npm, nó trình bày cả hai phương pháp, với cách tiếp cận thư mục tương đối này như một cách viết tắt.
MJ

1
Phương pháp thứ hai (sử dụng file:phương pháp tiếp cận) được phép cho ứng dụng của tôi và mô đun cục bộ để chia sẻ một phụ thuộc. Thử nghiệm của tôi về npm linkkết quả là một phụ thuộc trùng lặp, phá vỡ mọi thứ nếu phụ thuộc cần phải được sử dụng như một đơn vị.
Daniel Waltrip

Tôi đã có một gói cục bộ (giả sử gói1), gói2 có một phụ thuộc được đề cập với đường dẫn tương đối của gói1. npm tôi không cài đặt gói khi đường dẫn tương đối bắt đầu bằng "file: ../../ pack1", hoạt động khi nó là '' ../../package1 ", việc thêm tệp vào lúc bắt đầu có nghĩa gì khác không?
Dip686

17

npm pack + package.json

Đây là những gì làm việc cho tôi:

BƯỚC 1: Vào module project, thực hiệnnpm pack :

Điều này sẽ xây dựng một <package-name>-<version>.tar.gz tập tin.

BƯỚC 2: Di chuyển tệp đến consumer project

Lý tưởng nhất là bạn có thể đặt tất cả các tệp như vậy vào một tmpthư mục trong thư mục consumer-projectgốc của bạn :

BƯỚC 3: Tham khảo nó trong package.json:

"dependencies": {
  "my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}

BƯỚC 4: Installcác gói:

npm installhoặc npm ihoặcyarn

Gói của bạn nên có sẵn trong của bạn consumer-project's node_modules thư mục .

Chúc may mắn...


10

Cả hai cách tiếp cận này ( npm linkhoặcpackage.json phụ thuộc tệp) đều hoạt động nếu mô đun cục bộ có các phụ thuộc ngang hàng mà bạn chỉ muốn cài đặt trong phạm vi dự án của bạn.

Ví dụ:

/local/mymodule/package.json:
  "name": "mymodule",
  "peerDependencies":
  {
    "foo": "^2.5"
  }

/dev/myproject/package.json:
  "dependencies":
  {
    "mymodule": "file:/local/mymodule",
    "foo": "^2.5"
  }

Trong kịch bản này, bộ NPM lên myprojectnode_modules/như thế này:

/dev/myproject/node_modules/
  foo/
  mymodule -> /local/mymodule

Khi nút tải mymodulevà nó thực hiện require('foo'), nút sẽ giải quyết mymoduleliên kết tượng trưng, ​​và sau đó chỉ nhìn vào /local/mymodule/node_modules/(và tổ tiên của nó) foomà nó không tìm thấy. Thay vào đó, chúng tôi muốn nút nhìn vào /local/myproject/node_modules/, vì đó là nơi đang chạy dự án của chúng tôi và nơifoo được cài đặt.

Vì vậy, chúng ta có cần một cách để nói với nút để không giải quyết liên kết tượng trưng này khi tìm kiếm foo, hoặc chúng ta cần một cách để nói NPM để cài đặt một bản sao của mymodulekhi cú pháp tập tin phụ thuộc được sử dụng trong package.json. Thật không may, tôi cũng không tìm được cách nào để làm


Tôi tìm thấy một cách giải quyết, đó là thiết lập NODE_PATHđể trỏ đến node_modules/nơi foođược cài đặt. Vì vậy, đối với trường hợp trên, nó sẽ là thế này: NODE_PATH=/dev/myproject/node_modules/ Điều đó cho phép mymoduletìm thấy foo.
Paul Medynski

Có một giải pháp cho. Đặt các mô-đun phụ thuộc trong thư mục gốc của dự án . Xác định các phụ thuộc của bạn trong gói.json với tiền tố 'tệp:' thông thường . Do npm i Điều này sẽ tạo ra một liên kết tượng trưng trong node_modules của dự án cũng như các phụ thuộc của nó có thể được kéo lên toplevel node_modules như đối với các loại phụ thuộc khác. Phiên bản npm của tôi là v6.14.4. Sau khi dành vài giờ để khắc phục vấn đề này, đã tìm thấy giải pháp này tại đây: ( atmos.washington.edu/~nbren12/reports/journal/ trộm ). Cảm ơn nbren12.
sasebot

Tôi đã gặp rắc rối tương tự. Tôi đã tìm thấy câu trả lời này: stackoverflow.com/questions/50807329/ , điều này giải quyết vấn đề của tôi với các phụ thuộc ngang hàng và các thư viện địa phương.
theawless

0

Thiếu tài sản chính?

Như những người trước đã trả lời npm --save ../location-of-your-packages-root-directory. Các ../location-of-your-packages-root-directorytuy nhiên phải có hai điều để cho nó để làm việc.

1) package.jsontrong thư mục đó chỉ về phía

2) mainthuộc tính package.jsonphải được đặt và làm việc ig "main": "src/index.js",nếu tệp mục nhập cho ../location-of-your-packages-root-directory../location-of-your-packages-root-directory/src/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.