การติดตั้ง npm จาก Git ในบางรุ่น


181

สมมติว่าฉันได้เขียนโมดูลสำหรับ Node.js ซึ่งฉันต้องการเก็บไว้เป็นส่วนตัว ฉันรู้ว่าฉันสามารถ (ควร) เพิ่มบรรทัด:

"private": "true"

ไปที่package.jsonไฟล์และฉันก็รู้ว่าฉันสามารถnpm installโมดูลนี้โดยใช้เส้นทางของระบบไฟล์หรือลิงค์ไปยังที่เก็บ git รวมถึง GitHub

ฉันยังรู้ว่าฉันสามารถใส่เส้นทางของระบบไฟล์หรือลิงค์ไปยัง repo git package.jsonเพื่อให้dependenciesส่วนนั้นมีลักษณะเช่นนี้:

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

สิ่งที่ฉันต้องการตอนนี้ไม่ได้เชื่อมโยงไปยังรุ่นล่าสุด แต่ไปยังรุ่นที่เฉพาะเจาะจง ความเป็นไปได้เพียงอย่างเดียวที่ฉันรู้คือการเชื่อมโยงไปยังการส่งคำสั่งโดยใช้ ID 0.3.1แต่นี้เป็นวิธีที่สามารถอ่านได้น้อยและที่เลวร้ายยิ่งกว่าการใช้การบำรุงรักษาหมายเลขรุ่นเช่น

ดังนั้นคำถามของฉันคือ: เป็นไปได้ที่จะระบุหมายเลขรุ่นดังกล่าวแล้วและทำการค้นหาที่เก็บ git สำหรับการกระทำล่าสุดที่รวมเวอร์ชันนี้ไว้ด้วยหรือไม่

ถ้าไม่คุณจะแก้ไขปัญหานี้ในโครงการของคุณได้อย่างไร คุณใช้ชีวิตอยู่กับการส่งรหัสหรือมีวิธีแก้ปัญหาที่ดีกว่านี้หรือไม่?

คำตอบ:


193

พึ่งพาจะต้องมีความพร้อมใช้งานจากregistryที่จะติดตั้งเพียงแค่ระบุversionบ่ง

แน่นอนคุณสามารถสร้างและใช้รีจิสตรีของคุณเองแทนที่จะเป็นregistry.npmjs.orgโปรเจ็กต์ของคุณไม่ควรแชร์ต่อสาธารณะ

แต่ถ้ามันไม่ได้อยู่ในรีจิสทรีก็จะต้องได้รับการอ้างอิงโดยURLหรือGit URL เพื่อระบุรุ่นที่มี URL ที่ Git รวมที่เหมาะสม<commit-ish>เช่นแท็กในตอนท้ายเป็นส่วนย่อยของ URL

ตัวอย่างสำหรับแท็กชื่อ0.3.1:

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

หมายเหตุ : ตัวอย่างด้านบนแสดง URL พื้นฐานเหมือนกับที่โพสต์ในคำถาม

ส่วน snipped ( ...) ควรกรอก:

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

และรูปแบบที่อยู่อื่นจะต้องใช้เมื่อไม่มีการเข้าถึง SSH:

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

ทั้งนี้ขึ้นอยู่กับระบบปฏิบัติการของคุณคุณยังสามารถlinkพึ่งพาในโฟลเดอร์อื่นที่คุณได้ทำการโคลนจาก Github


1
ดูเหมือนว่าลิงก์บางรายการในโพสต์นี้ล้าสมัยแล้วเนื่องจากมันนำไปสู่หน้า 404 แทน ซึ่งน่าเสียดายเนื่องจากบางส่วนนี้เป็นข้อมูลที่ฉันมองหามาระยะหนึ่งแล้ว
MvG

5
ฉันติดแท็กเวอร์ชันเฉพาะด้วยgit tag -a "1.0.0"และผลักดันgit push --tagsจากนั้นฉันเพิ่ม#v1.0.0ส่วนท้ายของการgit+sshพึ่งพา แต่npm updateไม่มีอะไรเกิดขึ้น
loretoparisi

3
@loretoparisi ขออภัย ฉันไม่ได้ตั้งใจจะแนะนำให้เพิ่มvเป็นสิ่งจำเป็น หลังจาก#ที่ส่วนควรจะตรงกับชื่อเต็มของแท็ก (หรืออื่น ๆcommitsh ) - #1.0.0ในกรณีของคุณ
Jonathan Lonowski

ตั้งแต่เดือนกรกฎาคม 2559 การโฮสต์รีจิสตรีของตนเองมีความซับซ้อนมากขึ้นเนื่องจากพวกเขาเปลี่ยนจาก couchdb เป็น microservices
Yan Foto

3
ตอนนี้คุณสามารถทำnpm i {owner}/{project}#{tag}หรือเพิ่ม"{library}": "github:{owner}/{project}#{tag}"package.json แทนการใช้git@github.comหรือgit://github.com
Mike W

238

คำตอบที่ยอมรับไม่ได้ผลสำหรับฉัน นี่คือสิ่งที่ฉันกำลังทำเพื่อดึงแพคเกจจาก Github:

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

หรือเพิ่มด้วยตนเองบน package.json:

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

41
หากคุณใช้ http / https ตรวจสอบให้แน่ใจว่าคุณใส่คำนำหน้า "git +":"package": "git+https://github.com/username/package.git#commit"
Ates Goral

4
สิ่งนี้ทำงานได้ดีเท่ากับ "การติดตั้ง npm" แต่เมื่อฉันพยายามเรียกใช้แอปพลิเคชันของฉันความต้องการ ('mymodule') ไม่สามารถค้นหาแพ็คเกจได้ แม้ว่าแพ็กเกจจะอยู่ในไดเร็กทอรี node_modules ด้วยชื่อเดียวกัน
ปั้นจั่นขนาดใหญ่

โอ้โมดูลที่สงสัยไม่ได้รวมบิลด์ด้วยการคอมมิทเฉพาะที่ฉันต้องการดังนั้นถ้าคุณมีปัญหาเดียวกันคุณอาจต้องสร้างมันด้วยตนเอง
ปั้นจั่น

1
นอกจากนี้คุณยังสามารถใช้#tagซึ่งมักจะชี้ไปที่หมายเลขรุ่น
deltree

1
@surjikal คุณต้องติดแท็กการวางจำหน่ายก่อนที่คุณจะสามารถใช้หมายเลขเวอร์ชันด้วย git เช่นgit tag -a v1.0.1 && git push --tag && git push@Jonathan Lonowski ก็พูดในความคิดเห็นด้วย
dotnetCarpenter

80

หากเป็นเวอร์ชั่นที่คุณหมายถึงแท็กหรือรีลีส Github จะให้ลิงค์สำหรับดาวน์โหลด ตัวอย่างเช่นถ้าผมต้องการที่จะติดตั้งสามารถดึงข้อมูลเวอร์ชัน 0.3.2 (มันไม่สามารถใช้ได้ใน NPM) แล้วฉันเพิ่มของฉันpackage.jsonภายใต้dependencies:

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

ข้อเสียเปรียบเพียงอย่างเดียวเมื่อเปรียบเทียบกับวิธีแฮชการคอมมิชชันคือแฮชรับประกันว่าจะไม่แสดงรหัสการเปลี่ยนแปลงในขณะที่แท็กอาจถูกแทนที่ โชคดีที่สิ่งนี้ไม่ค่อยเกิดขึ้น

ปรับปรุง:

ทุกวันนี้วิธีที่ฉันใช้คือสัญกรณ์ขนาดกะทัดรัดสำหรับ GitHub ที่ใช้เพื่ออ้างอิง:

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

การกระทำใดสามารถกระทำอะไรก็ได้เช่นแท็ก ในกรณีของ GitHub คุณสามารถวางค่าเริ่มต้นได้github:เนื่องจากเป็นค่าเริ่มต้น


โหมดเก็บถาวรยังใช้งานได้สำหรับการกระทำ เช่น `เส้นด้ายเพิ่ม github.com/github/fetch/archive/
......

ทางออกที่สะอาดที่สุด
Charley Bodkin

8

ความคิดเห็นตัวอย่างของฉันสำหรับ @qubyte ด้านบนถูกสับแล้วนี่คือสิ่งที่อ่านง่ายกว่า ...

วิธีการ @surjikal อธิบายไว้ข้างต้นทำงานได้สำหรับการกระทำของสาขา แต่มันไม่ได้ผลสำหรับต้นไม้ที่ฉันพยายามรวมไว้


โหมดเก็บถาวรยังใช้งานได้สำหรับคอมมิท ตัวอย่างเช่นดึงข้อมูล @ a2fbf83

npm :

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

เส้นด้าย :

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

รูปแบบ :

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


ที่นี่ต้นไม้ยอมรับว่าต้องใช้/archive/โหมด:

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

สำหรับvuexที่เกี่ยวข้องส่งมอบ


8

คำสั่งนี้ติดตั้งแพ็กเกจ npm username/packageจากคอมมิทเฉพาะคอมมิต:

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

นี่3d0a21ccคือ 8 ตัวอักษรแรกของการกระทำการแฮช


3

ฉันอธิบายปัญหาที่ฉันเผชิญเมื่อใช้งานที่นี่npm install- แพคเกจไม่ปรากฏขึ้นnode_modulesแพคเกจไม่ปรากฏใน

ปัญหาคือว่าnameค่าในpackage.jsonของแพคเกจที่ติดตั้งแตกต่างจากชื่อของแพคเกจที่นำเข้า (คีย์มาpackage.jsonโครงการของฉัน)

ดังนั้นถ้าชื่อโครงการติดตั้งของคุณsome-package(มูลค่าที่ชื่อของมันpackage.json) แล้วในการเขียนโครงการของคุณ:package.json"some-package": "owner/some-repo#tag"


ฉันหวังว่าฉันจะพบคำตอบของคุณก่อนหน้านี้ I - ฉันเพิ่งแก้ไขด้วยปัญหาเดียวกันทำให้ฉันต้องดิ้นรนอยู่พักหนึ่ง และnameข้อกำหนดนี้ไม่ได้กล่าวถึงบ่อยครั้งในสุทธิ .. (ไม่ใช่ว่าฉันจะได้รับอย่างน้อยก็ในนั้น)
Kamafeather

"เพิ่มการพึ่งพาแพ็คเกจของคุณไปยัง package.json ของคุณเพื่อระบุชื่อแพ็กเกจที่มีขอบเขตเต็ม" - ไม่เน้น: help.github.com/en/articles/…
Kamafeather

ฉันพบว่าnpm install --save git+https://<remote-github-repo-url>เป็นวิธีที่ปลอดภัยที่จะไม่ตีปัญหานี้อีกในอนาคต
Kamafeather

2

ฉันต้องการเรียกใช้tfjs-coreสองรุ่นและพบว่าทั้งคู่ต้องถูกสร้างหลังจากติดตั้ง

package.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"
}

แล้ว:

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 ../../

และสุดท้ายคือการใช้ห้องสมุด:

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';

นี้ใช้งานได้ดี แต่แน่นอน #hoodrat


1
ขอบคุณฉันพยายามนำเข้าทุกอย่างเท่าที่จะเป็นไปได้ ฉันต้องเห็นตัวอย่างข้อมูลของคุณเพื่อรับรู้ว่าฉันต้องนำเข้าไฟล์โดยตรง
Victor Ivens

1

หากคุณกำลังทำสิ่งนี้กับโมดูลมากกว่าหนึ่งโมดูลและต้องการควบคุมเวอร์ชันมากกว่านี้คุณควรพิจารณาว่ามีรีจิสตรี npm ส่วนตัวของคุณเอง

วิธีนี้คุณสามารถ npm เผยแพร่โมดูลของคุณไปยังการลงทะเบียน npm ส่วนตัวของคุณและใช้รายการ package.json เช่นเดียวกับที่คุณทำกับโมดูลสาธารณะ

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


ลิงก์ทั้งหมดคือ 404
Cyrille Pontvieux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.