cài đặt npm từ Git trong một phiên bản cụ thể


181

Giả sử rằng tôi đã viết một mô-đun cho Node.js mà tôi muốn giữ riêng tư. Tôi biết rằng tôi có thể (nên) thêm dòng:

"private": "true"

vào package.jsontệp và tôi cũng biết rằng tôi có thể npm installmô-đun này sử dụng đường dẫn hệ thống tệp hoặc liên kết đến kho lưu trữ git, bao gồm GitHub.

Tôi cũng biết rằng tôi có thể đặt đường dẫn hệ thống tệp như vậy hoặc liên kết đến repo git package.jsonđể dependenciesphần đó có thể trông giống như thế này:

"dependencies": {
  "myprivatemodule": "git@github.com:..."
}

Những gì tôi muốn bây giờ không phải là liên kết đến phiên bản mới nhất, mà là một phiên bản cụ thể. Khả năng duy nhất tôi biết là liên kết đến một cam kết cụ thể bằng ID của nó. Nhưng đây là cách ít đọc và bảo trì kém hơn so với sử dụng số phiên bản như 0.3.1.

Vì vậy, câu hỏi của tôi là: Có thể chỉ định số phiên bản như vậy không và thực hiện tìm kiếm npm kho git cho cam kết mới nhất bao gồm phiên bản này?

Nếu không, làm thế nào để bạn giải quyết vấn đề này trong các dự án của bạn? Bạn có sống với ID cam kết hay có giải pháp nào tốt hơn cho việc này không?

Câu trả lời:


193

Một phụ thuộc phải có sẵn từ registryđể được cài đặt chỉ bằng cách chỉ định một versionmô tả .

Bạn chắc chắn có thể tạo và sử dụng sổ đăng ký của riêng mình thay vì registry.npmjs.orgnếu các dự án của bạn không được chia sẻ công khai.

Nhưng, nếu nó không có trong sổ đăng ký, nó sẽ phải được tham chiếu bởi URL hoặc URL Git . Để chỉ định một phiên bản có URL Git, hãy bao gồm một phiên bản thích hợp <commit-ish>, chẳng hạn như thẻ, ở cuối là một đoạn URL .

Ví dụ: đối với thẻ có tên 0.3.1:

"dependencies": {
  "myprivatemodule": "git@github.com:...#0.3.1"
}

Lưu ý : Đoạn mã trên hiển thị URL cơ sở giống như được đăng trong câu hỏi.

Phần snipped ( ...) nên được điền vào:

"myprivatemodule": "git@github.com:{owner}/{project}.git#0.3.1"

Và, sẽ cần một định dạng địa chỉ khác khi không có quyền truy cập SSH:

"myprivatemodule": "git://github.com/{owner}/{project}.git#0.3.1"

Tùy thuộc vào hệ điều hành của bạn, bạn cũng có thể linkphụ thuộc vào thư mục khác nơi bạn đã sao chép nó từ Github.


1
Có vẻ như một số liên kết trong bài đăng này đã lỗi thời, vì chúng dẫn đến các trang 404 thay thế. Thật đáng tiếc, vì một số trong số này là thông tin tôi đã tìm kiếm khá lâu.
MvG

5
Tôi đã gắn thẻ một phiên bản cụ thể với git tag -a "1.0.0"và đẩy git push --tags, sau đó tôi đã thêm #v1.0.0vào cuối phần git+sshphụ thuộc. Nhưng npm updatekhông có gì xảy ra.
loretoparisi

3
@loretoparisi Xin lỗi. Tôi không có ý đề nghị thêm vlà cần thiết. Sau khi #, các đoạn phải phù hợp với tên đầy đủ của thẻ (hoặc khác commitsh ) - trong trường hợp của bạn, #1.0.0.
Jonathan Lonowski

Kể từ tháng 7 năm 2016, việc lưu trữ sổ đăng ký riêng đã trở nên phức tạp hơn khi họ chuyển từ couchdb sang microservice
Yan Foto

3
Bây giờ bạn có thể thực hiện npm i {owner}/{project}#{tag}hoặc thêm "{library}": "github:{owner}/{project}#{tag}"vào pack.json thay vì sử dụng git@github.comhoặcgit://github.com
Mike W

238

Câu trả lời được chấp nhận không làm việc cho tôi. Đây là những gì tôi đang làm để lấy một gói từ github:

npm install --save "git://github.com/username/package.git#commit"

Hoặc thêm nó thủ công trên pack.json:

"dependencies": {
  "package": "git://github.com/username/package.git#commit"
}

41
Nếu bạn đang sử dụng http / https, hãy đảm bảo bạn bao gồm tiền tố "git +":"package": "git+https://github.com/username/package.git#commit"
Ates Goral

4
Điều này hoạt động đến mức "npm install" nhưng khi tôi cố chạy ứng dụng của mình thì yêu cầu ('mymodule') không thể tìm thấy gói đó. Mặc dù gói nằm trong thư mục node_modules có cùng tên.
Derrick

Ồ, mô-đun được đề cập không bao gồm bản dựng với cam kết cụ thể mà tôi muốn, vì vậy nếu bạn gặp vấn đề tương tự, bạn có thể phải xây dựng thủ công.
Derrick

1
bạn cũng có thể sử dụng #tagthường chỉ vào một số phiên bản
deltree

1
@surjikal bạn cần gắn thẻ một bản phát hành trước khi bạn có thể sử dụng số phiên bản với git. ví dụ git tag -a v1.0.1 && git push --tag && git pushnhư @Jonathan Lonowski cũng nói trong một bình luận.
dotnetCarpenter

80

Nếu theo phiên bản, bạn có nghĩa là một thẻ hoặc một bản phát hành, thì github cung cấp các liên kết tải xuống cho những cái đó. Ví dụ: nếu tôi muốn cài đặt phiên bản tìm nạp 0.3.2 (nó không khả dụng vào npm), thì tôi thêm vào package.jsonbên dưới dependencies:

"fetch": "https://github.com/github/fetch/archive/v0.3.2.tar.gz",

Nhược điểm duy nhất khi so sánh với phương pháp băm cam kết là hàm băm được đảm bảo không đại diện cho mã đã thay đổi, trong khi thẻ có thể được thay thế. Rất may điều này hiếm khi xảy ra.

Cập nhật:

Ngày nay, cách tiếp cận tôi sử dụng là ký hiệu nhỏ gọn cho một phụ thuộc được phục vụ GitHub:

"dependencies": {
  "package": "github:username/package#commit"
}

Trường hợp cam kết có thể là bất cứ điều gì cam kết, như một thẻ. Trong trường hợp của GitHub, bạn thậm chí có thể bỏ chữ cái đầu tiên github:vì nó là mặc định.


Chế độ lưu trữ cũng hoạt động cho các cam kết; ví dụ, `sợi add github.com/github/fetch/archive/... '
bvj

Giải pháp sạch nhất.
Charley Bodkin

8

Nhận xét ví dụ của tôi về @qubyte ở trên đã bị cắt nhỏ, vì vậy đây là thứ dễ đọc hơn ...

Phương thức @surjikal được mô tả ở trên hoạt động cho các cam kết chi nhánh, nhưng nó không hoạt động đối với một cam kết cây mà tôi đang thử bao gồm.


Chế độ lưu trữ cũng hoạt động cho các cam kết. Ví dụ: tìm nạp @ a2fbf83

NPM :

npm install  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

sợi :

yarn add  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

định dạng :

 https://github.com/<owner>/<repo>/archive/<commit-id>.tar.gz


Đây là cây cam kết yêu cầu /archive/chế độ:

yarn add  https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz

cho cam kết vuex liên quan


8

Lệnh này cài đặt gói npm username/packagetừ cam kết git cụ thể:

npm install https://github.com/username/package#3d0a21cc

Đây 3d0a21cclà 8 ký tự đầu tiên của hàm băm cam kết.


3

Tôi mô tả ở đây một vấn đề mà tôi gặp phải khi chạy npm install- gói không xuất hiện node_modules.

Vấn đề là namegiá trị trong package.jsongói đã cài đặt khác với tên của gói đã nhập (khóa trong package.jsondự án của tôi).

Vì vậy, nếu tên dự án đã cài đặt của bạn là some-package(giá trị tên trong package.jsonđó) thì trong package.jsondự án của bạn hãy viết : "some-package": "owner/some-repo#tag".


Tôi ước tôi tìm thấy câu trả lời của bạn sớm hơn 😓 - Tôi vừa giải quyết, với cùng một vấn đề khiến tôi phải vật lộn một lúc; và nameyêu cầu này không được đề cập thường xuyên trên mạng .. (ít nhất là tôi không thể chịu được điều đó, ít nhất).
Kamafeather

"Thêm các phụ thuộc gói của bạn vào gói.json chỉ định tên gói đầy đủ trong phạm vi." - Không thực sự nhấn mạnh điều đó: help.github.com/en/articles/ Kẻ
Kamafeather

Tôi phát hiện ra rằng đó npm install --save git+https://<remote-github-repo-url>là một cách khá an toàn để không gặp phải vấn đề này trong tương lai.
Kamafeather

2

Tôi cần chạy hai phiên bản tfjs-core và thấy rằng cả hai đều cần được xây dựng sau khi được cài đặt.

gói.json:

"dependencies": {
  "tfjs-core-0.14.3": "git://github.com/tensorflow/tfjs-core#bb0a830b3bda1461327f083ceb3f889117209db2",
  "tfjs-core-1.1.0": "git://github.com/tensorflow/tfjs-core#220660ed8b9a252f9d0847a4f4e3c76ba5188669"
}

Sau đó:

cd node_modules/tfjs-core-0.14.3 && yarn install && yarn build-npm && cd ../../
cd node_modules/tfjs-core-1.1.0  && yarn install && yarn build-npm && cd ../../

Và cuối cùng, để sử dụng các thư viện:

import * as tf0143 from '../node_modules/tfjs-core-0.14.3/dist/tf-core.min.js';
import * as tf110 from '../node_modules/tfjs-core-1.1.0/dist/tf-core.min.js';

Điều này làm việc rất tốt nhưng chắc chắn là #hoodrat


1
Cảm ơn bạn, tôi đã cố gắng nhập nó theo mọi cách có thể tưởng tượng khác. Tôi đã phải xem đoạn trích của bạn để nhận ra rằng tôi phải nhập trực tiếp từ tệp.
Victor Ivens

1

Nếu bạn đang làm điều này với nhiều hơn một mô-đun và muốn có nhiều quyền kiểm soát hơn các phiên bản, bạn nên xem xét việc đăng ký npm riêng của mình.

Bằng cách này, bạn có thể npm xuất bản các mô-đun của mình lên sổ đăng ký npm riêng tư của bạn và sử dụng các mục nhập pack.json giống như cách bạn làm cho các mô-đun công cộng.

https://docs.npmjs.com/files/package.json#dependencies


Tất cả các liên kết là 404
Cyrille Pontvieux
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.