npm cài đặt và xây dựng repo github ngã ba


125

Đây không phải là một câu hỏi hoàn toàn mới, nhưng hiện tại tôi đang tìm kiếm một điều tốt và tôi đang gặp khó khăn trong việc tìm giải pháp.

Tôi đang sử dụng một mô-đun cho ứng dụng góc của mình được gọi là angular-dịch. Tuy nhiên, tôi đã phải thực hiện một vài sửa đổi nhỏ cho mã nguồn để mọi thứ hoạt động theo cách tôi muốn, và bây giờ tôi muốn tiếp tục những thay đổi đó npm install. Một đồng nghiệp đề nghị tôi rẽ nhánh repo của mã nguồn và chỉ vào repo rẽ nhánh của tôi như một sự phụ thuộc, mà tôi đã thử theo những cách này, ví dụ

npm install https://github.com/myRepo/angular-translate
npm install https://github.com/myRepo/angular-translate/archive/master.tar.gz

Cái đầu tiên cho tôi một thư mục như thế này mà không có bản dựng. Chỉ là một gói.json, .npmignore và một số tệp đánh dấu

-angular-translate
   .npmignore 
   .nvmrc
    CHANGELOG.md 
    package.json
    etc

Thứ hai npm installcung cấp cho tôi bản repo đầy đủ, nhưng một lần nữa tôi không nhận được bản dựng như khi tôi sử dụng lệnh npm install angular-translate. Tôi đã thấy một số khó khăn khi chạy tập lệnh phát hành trước, nhưng tôi không chắc làm thế nào để làm điều này khi cài đặt tất cả các mô-đun. Tôi cũng đã thử xuất bản ngã ba dưới dạng mô-đun của riêng mình lên sổ đăng ký npm, nhưng một lần nữa tôi không nhận được bản dựng nào và tôi không chắc đó là điều đúng đắn ...

Tôi xin lỗi vì sự thiếu hiểu biết của tôi về chủ đề này. Tôi không có nhiều kinh nghiệm với npm. Rất thích nhận được một số phản hồi về vấn đề này. Có vẻ như đó có thể là một vấn đề đủ phổ biến khi cần sửa đổi đối với mã nguồn của gói? Có lẽ có một giải pháp tốt hơn? Cảm ơn trước sự giúp đỡ của bạn.

Câu trả lời:


139

Hãy thử npm install <ghusername>/<repoName>, <ghUsername>tên người dùng GitHub của bạn ở đâu (không có @) và <repoName>là tên của kho lưu trữ. Điều đó nên cài đặt chính xác nó. Bạn rất có thể muốn sử dụng --savehoặc --save-devgắn cờ với lệnh cài đặt để lưu sự phụ thuộc trong của bạn package.json.

Nếu điều đó không hoạt động chính xác, hãy kiểm tra nội dung của .npmignoretập tin của bạn .

Đừng hoảng sợ nếu lệnh cài đặt mất nhiều thời gian; cài đặt từ kho git chậm hơn cài đặt từ sổ đăng ký npm.


Biên tập:

Vấn đề của bạn là trong trường hợp của bạn, dist/không được cam kết với repo (vì nó nằm trong .gitignore). Đó là nơi mã thực tế sống. dist/được xây dựng từ các tệp src/trước khi gói được xuất bản đến sổ đăng ký npm, nhưng dist/không bao giờ được cam kết với repo.

Thật xấu xí, nhưng trong trường hợp này, bạn sẽ phải xóa dist/khỏi .gitignorevà sau đó chạy:

npm run build
git add .
git commit
git push

(Đảm bảo rằng bạn đã chạy npm installtrước)

Sau đó bạn sẽ có thể cài đặt từ github.

Có thể có một cách khác để làm điều này bằng cách sử dụng postinstalltập lệnh, nhưng tôi không chắc liệu điều đó có thể không; Tôi chưa bao giờ thử nó.


2
Đúng, đó là khá nhiều giải pháp. Cũng phải thực hiện cài đặt npm và sửa đổi GruntFile một chút, nhưng điều đó đã làm cho nó hoạt động. Cảm ơn sự giúp đỡ của bạn :)
hughesjmh

2
Có thực sự không có cách nào khác để làm gì ngoài distign unignore? Tôi muốn làm PR cho repo ban đầu, nhưng với dist, anh ấy sẽ không thích nó chứ?
Ka Mok

7
@KaMok Tôi nghĩ rằng một tùy chọn khác là, trong package.jsontệp của ngã ba của bạn, bên dưới scripts, đổi tên prepublishthành prepare. Có vẻ như khi npm installhoặc npm install github:user_name/fork_name --save(và tương tự cho sợi) được thực thi, nó cũng chạy những gì trong preparetập lệnh. Đây là giả sử prepublishtập lệnh của gói này tạo các tệp xây dựng, thường là trường hợp.
davidfrancisco

5
và nếu bạn cần một chi nhánh cụ thể,npm install <ghusername>/<repoName>#branchName
DrMeer

2
@RyanZim Bạn không chính xác. Cài đặt từ git hoạt động rất tốt miễn là nó được thiết lập đúng. docs.npmjs.com/cli/install "Nếu gói được cài đặt chứa một preparekịch bản, nó dependenciesdevDependenciessẽ được cài đặt, và chuẩn bị kịch bản sẽ được chạy, trước khi gói được đóng gói và cài đặt."
Cameron Tacklind

15

Cập nhật cho những người sử dụng npm 5:

Kể từ npm @ 5, prepublishcác tập lệnh không được chấp nhận.

Sử dụng preparecho các bước xây dựng và prepublishOnlychỉ tải lên.

Tôi tìm thấy thêm một "prepare": "npm run build"tập lệnh đã sửa tất cả các vấn đề của tôi.


Điều đó cũng làm việc cho tôi (trong một ngã ba tôi vừa làm) - cảm ơn! Tôi tự hỏi ... tại sao tất cả các gói chỉ bao gồm cấu hình tập lệnh này theo mặc định? Có phải vì các tác giả gói chỉ xem xét trường hợp sử dụng cài đặt gói của họ từ npm chứ không phải trường hợp cài đặt nó từ một repo git? Vì vậy, chúng chỉ được sử dụng để chạy thủ công npm run buildnpm run publishkhông gặp phải bất kỳ vấn đề hoặc đau đớn nào trừ khi một ngày nào đó chúng cố gắng cài đặt repo qua git?
Tyler Rick

9

Mã được xuất bản cho npmjs.com thường không phải là những gì trong kho lưu trữ cho gói. Thông thường là "biên dịch" các tệp nguồn JavaScript thành các phiên bản dành cho tiêu dùng chung trong các thư viện. Đó là những gì thường được xuất bản cho npmjs.com.

Nó phổ biến đến mức đó là một tính năng npmđể tự động chạy bước "xây dựng" trước khi xuất bản ( npm publish). Điều này ban đầu được gọi là prepublish. Có vẻ như Npm nghĩ rằng sẽ rất hữu ích khi chạy prepublishtập lệnh trên npm installvì đó là cách tiêu chuẩn để khởi tạo môi trường phát triển.

Điều này đã kết thúc dẫn đến một số nhầm lẫn lớn trong cộng đồng. Có những vấn đề rất dài trên github về điều này.

Cuối cùng, trong nỗ lực không thay đổi hành vi cũ, họ đã quyết định thêm hai tập lệnh tự động nữa: prepublishOnlyprepare.

prepublishOnlylàm những gì bạn mong đợi. Nó không chạy trên npm install. Nhiều người bảo trì gói chỉ mù quáng chuyển sang cái này.

Nhưng cũng có vấn đề này mà mọi người muốn không phụ thuộc vào npmjs.com để phân phối các phiên bản của các gói. Kho Git là sự lựa chọn tự nhiên. Tuy nhiên, thực tế phổ biến là không cam kết các tệp "đã biên dịch" với git. Đó là những gì prepaređã được thêm vào để xử lý ...

prepare là cách chính xác

Nếu bạn có một kho lưu trữ với các tệp nguồn nhưng bước "xây dựng" là cần thiết để sử dụng nó,
preparethực hiện chính xác những gì bạn muốn trong mọi trường hợp (kể từ npm 4).

prepare: Chạy cả TRƯỚC KHI gói được đóng gói và xuất bản, trên cục bộ npm installmà không có bất kỳ đối số nào và khi cài đặt phụ thuộc git.

Bạn thậm chí có thể đặt các phụ thuộc xây dựng của mình vào devDependenciesvà chúng sẽ được cài đặt trước khi prepaređược thực thi.

Dưới đây là một ví dụ về một gói của tôi sử dụng phương pháp này.


Có vấn đề với .gitignore

Có một vấn đề với tùy chọn này được nhiều người. Khi chuẩn bị một phụ thuộc, Npm và Sợi sẽ chỉ giữ các tệp được liệt kê trong filesphần package.json.

filesMọi người có thể thấy rằng mặc định cho tất cả các tệp được bao gồm và nghĩ rằng chúng đã được thực hiện. Điều dễ bị bỏ qua là .npmignore phần lớn ghi đè fileschỉ thị , nếu .npmignorekhông tồn tại, .gitignoređược sử dụng thay thế.

Vì vậy, nếu bạn có các tệp được xây dựng của mình được liệt kê .gitignorenhư một người tỉnh táo và không làm gì khác, preparesẽ có vẻ bị hỏng

Nếu bạn sửa fileschỉ bao gồm các tệp được xây dựng hoặc thêm trống .npmignore, bạn đã hoàn tất.

Đề nghị của tôi là đặt files(hoặc, bằng cách đảo ngược .npmignore) , sao cho các tệp duy nhất thực sự được xuất bản là những tệp cần thiết cho người dùng của gói đã xuất bản. Imho, không cần bao gồm các nguồn chưa biên dịch trong các gói được xuất bản.


Câu trả lời gốc: https://stackoverflow.com/a/57503862/4612476


1
PREPARE làm việc cho tôi thay vì POSTINSTALL.i chỉ chạy npm run build trong chuẩn bị.
Milind

6

Để cõng câu trả lời tuyệt vời của @ RyanZim, postinstallchắc chắn là một lựa chọn hợp lệ cho việc này.

Hoặc là làm một trong những điều sau đây:

  1. Cập nhật gói.json trong repo rẽ nhánh của bạn để thêm phần tử postinstall vào tập lệnh. Ở đây, chạy bất cứ thứ gì bạn cần để có được đầu ra được biên dịch (Preferred).
  2. Cập nhật gói.json của bạn và thêm một cài đặt bài đăng cập nhật thư mục cần thiết trong node_modules.

Nếu bạn đã chia rẽ kho lưu trữ của người khác, thì có thể đáng để nêu ra một vấn đề để minh họa vấn đề cài đặt gói của họ thông qua GitHub không hoạt động vì nó không cung cấp các phương tiện cần thiết để xây dựng tập lệnh. Từ đó, họ có thể chấp nhận PR để giải quyết vấn đề này bằng cài đặt bài đăng hoặc họ có thể từ chối và bạn có thể làm # 2.


Bạn có thể giải thích hoặc có bất kỳ tài nguyên nào về cách làm # 2 không? Những lệnh nào tôi cần chạy sau khi cài đặt npm khi gitrepo chỉ chứa src không dist
Daniel

1
@Daniel Xin lỗi, tôi đang cố nhớ bối cảnh nơi tôi đã làm điều này trong quá khứ. Tôi nghĩ rằng ở # 2, tôi có nghĩa là thêm một bước cài đặt vào gói chính.json của bạn để chạy các bước cho câu trả lời hàng đầu, do đó, một số thứ "postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"để đảm bảo rằng gói gây rắc rối cho bạn được xây dựng trước khi ứng dụng của bạn chạy. Tuy nhiên, như đã nói, tôi thích cách tiếp cận repo cho người dùng của mình hơn, thêm cài đặt bài đăng vào gói và sử dụng nó trong ứng dụng của tôi.
Mike B

Tôi nghĩ rằng việc thêm vào để chuẩn bị nên được ưu tiên (câu trả lời của @ Simon), bởi vì nếu cài đặt từ npm, bạn sẽ không cần phải thực hiện bất kỳ tòa nhà bổ sung nào vì nó đã bao gồm một dist / dir. Xem docs.npmjs.com/misc/scripts : "chuẩn bị: Chạy cả TRƯỚC KHI gói được đóng gói và xuất bản, ... và khi cài đặt phụ thuộc git"
Tyler Rick

postinstalllà một bước ngắn của giải pháp đúng. Chỉ cần sử dụng prepare. Đó là năm 2020.
Cameron Tacklind

2

Chỉ cần sử dụng lệnh npm install git+https://git@github.com/myRepo/angular-translate.git. Cảm ơn.

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.