npm ติดตั้งและสร้าง repo github แบบแยกส่วน


126

นี่ไม่ใช่คำถามใหม่ทั้งหมด แต่ตอนนี้ฉันกำลังมองหาสิ่งที่ดีและฉันกำลังมีปัญหาในการหาทางแก้ไข

ฉันกำลังใช้โมดูลสำหรับแอพเชิงมุมที่เรียกว่า angular-translate อย่างไรก็ตามฉันต้องทำการแก้ไขเล็กน้อยในซอร์สโค้ดเพื่อให้ทุกอย่างทำงานได้ตามที่ฉันต้องการและตอนนี้ฉันต้องการคงการเปลี่ยนแปลงเหล่านั้นต่อnpm installไป เพื่อนร่วมงานแนะนำให้ฉันแยก repo ของซอร์สโค้ดและชี้ไปที่ repo ที่แยกของฉันเป็นการพึ่งพาซึ่งฉันได้ลองด้วยวิธีเหล่านี้เช่น

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

อย่างแรกทำให้ฉันมีไดเร็กทอรีแบบนี้โดยไม่มีบิลด์ เพียงแค่ package.json, .npmignore และไฟล์ markdown บางไฟล์

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

ประการที่สองnpm installให้ฉันซื้อคืนเต็มรูปแบบอีกครั้ง npm install angular-translateแต่ฉันไม่ได้รับการสร้างเช่นเมื่อผมใช้คำสั่ง ฉันเคยเห็นความแตกต่างของการเรียกใช้สคริปต์แบบ preublish แต่ฉันไม่แน่ใจว่าจะทำอย่างไรเมื่อติดตั้งโมดูลทั้งหมด ฉันได้ลองเผยแพร่ทางแยกเป็นโมดูลของตัวเองไปยังรีจิสตรี npm แต่อีกครั้งฉันไม่ได้สร้างและฉันไม่แน่ใจว่าเป็นสิ่งที่ถูกต้อง ...

ฉันขอโทษสำหรับความไม่รู้ของฉันในหัวข้อนี้ ฉันไม่มีประสบการณ์มากมายกับ npm ชอบที่จะรับคำติชมเกี่ยวกับปัญหานี้ ดูเหมือนว่าอาจเป็นปัญหาที่พบบ่อยพอสมควรเมื่อต้องทำการปรับเปลี่ยนซอร์สโค้ดของแพ็คเกจ? อาจจะมีทางออกที่ดีกว่านี้? ขอบคุณล่วงหน้าสำหรับความช่วยเหลือของ.

คำตอบ:


141

ลองชื่อผู้ใช้ GitHub ของคุณอยู่npm install <ghusername>/<repoName>ที่ไหน<ghUsername>(ไม่มี@) และ<repoName>เป็นชื่อของที่เก็บ ที่ถูกต้องควรติดตั้ง คุณมักจะต้องการใช้แฟล็ก--saveหรือ--save-devแฟล็กกับคำสั่ง install เพื่อบันทึกการพึ่งพาในpackage.jsonไฟล์.

หากทำงานไม่ถูกต้องให้ตรวจสอบเนื้อหาของไฟล์ .npmignoreไฟล์

อย่าตกใจหากคำสั่งติดตั้งใช้เวลานาน การติดตั้งจากที่เก็บ git จะช้ากว่าการติดตั้งจากรีจิสทรี npm


แก้ไข:

ปัญหาของคุณคือในกรณีของคุณdist/ไม่ได้ผูกพันกับ repo (เนื่องจากอยู่ใน.gitignore) นั่นคือที่ที่รหัสจริงอาศัยอยู่ dist/สร้างขึ้นจากไฟล์src/ก่อนที่แพ็กเกจจะเผยแพร่ไปยังรีจิสตรี npm แต่dist/จะไม่ผูกมัดกับ repo

มันน่าเกลียด แต่ในกรณีนี้คุณจะต้องลบออกdist/จาก.gitignoreนั้นจึงเรียกใช้:

npm run build
git add .
git commit
git push

(ให้แน่ใจว่าได้วิ่งnpm installก่อน)

จากนั้นคุณควรจะสามารถติดตั้งจาก github ได้

อาจมีวิธีอื่นในการทำเช่นนี้โดยใช้postinstallสคริปต์ แต่ฉันไม่แน่ใจว่าเป็นไปได้หรือไม่ ฉันไม่เคยลอง


2
ใช่นั่นเป็นทางออกที่ดีทีเดียว ยังต้องทำการติดตั้ง npm และแก้ไข GruntFile เล็กน้อย แต่ก็ทำให้มันใช้งานได้ ขอบคุณสำหรับความช่วยเหลือ :)
hughesjmh

2
ไม่มีวิธีอื่นที่จะทำกับสิ่งอื่นนอกจากระยะห่างที่ไม่เป็นอันตรายหรือไม่? ฉันต้องการทำ PR ให้กับ repo ดั้งเดิม แต่ด้วยความแตกต่างเขาจะไม่ชอบหรือไม่?
กะหมอก

7
@KaMok ผมคิดว่าตัวเลือกอื่นคือในpackage.jsonไฟล์ส้อมของคุณภายใต้scriptsเปลี่ยนชื่อไปprepublish prepareดูเหมือนว่าเมื่อใดnpm installหรือnpm install github:user_name/fork_name --save(และเหมือนกันสำหรับเส้นด้าย) ถูกดำเนินการมันจะรันสิ่งที่อยู่ในprepareสคริปต์ด้วย นี่คือสมมติว่าprepublishสคริปต์ของแพ็กเกจนี้สร้างไฟล์บิลด์ซึ่งโดยปกติจะเป็นเช่นนั้น
davidfrancisco

5
และหากคุณต้องการสาขาที่เฉพาะเจาะจงnpm install <ghusername>/<repoName>#branchName
DrMeers

2
@RyanZim คุณไม่ถูกต้อง การติดตั้งจาก git ใช้งานได้ดีตราบเท่าที่มีการตั้งค่าอย่างถูกต้อง docs.npmjs.com/cli/install "ถ้าแพคเกจการติดตั้งมีprepareสคริปต์ของตนdependenciesและdevDependenciesจะได้รับการติดตั้งและเตรียมสคริปต์จะถูกเรียกใช้ก่อนแพคเกจเป็นแพคเกจและติดตั้ง."
Cameron Tacklind

15

อัปเดตสำหรับผู้ที่ใช้ npm 5:

ตั้งแต่ npm @ 5 prepublishสคริปต์จะเลิกใช้งาน

ใช้prepareสำหรับขั้นตอนการสร้างและprepublishOnlyสำหรับการอัปโหลดเท่านั้น

ฉันพบว่าการเพิ่ม"prepare": "npm run build"สคริปต์ในการแก้ไขปัญหาทั้งหมดของฉัน


นั่นก็ใช้ได้ผลสำหรับฉันเช่นกัน (ในส้อมที่ฉันเพิ่งทำ) - ขอบคุณ! ฉันสงสัยว่า ... ทำไมแพ็คเกจทั้งหมดถึงไม่รวมการกำหนดค่าสคริปต์นี้ไว้เป็นค่าเริ่มต้น? เป็นเพราะผู้เขียนแพ็คเกจพิจารณาเฉพาะกรณีการใช้งานในการติดตั้งแพคเกจจาก npm ไม่ใช่กรณีการติดตั้งจาก git repo ใช่หรือไม่ ดังนั้นพวกเขาจึงคุ้นเคยกับการรันด้วยตนเองnpm run buildและnpm run publishไม่ประสบปัญหาหรือความเจ็บปวดใด ๆ เว้นแต่ว่าสักวันพวกเขาจะพยายามติดตั้ง repo ผ่าน git?
Tyler Rick

9

โค้ดที่เผยแพร่ไปยัง npmjs.com มักไม่ใช่สิ่งที่อยู่ในที่เก็บสำหรับแพ็กเกจ เป็นเรื่องปกติที่จะ "คอมไพล์" ไฟล์ต้นฉบับ JavaScript เป็นเวอร์ชันสำหรับการใช้งานทั่วไปในไลบรารี นั่นคือสิ่งที่มักเผยแพร่ไปยัง npmjs.com

เป็นเรื่องปกติมากที่คุณลักษณะของnpmการเรียกใช้ขั้นตอน "สร้าง" โดยอัตโนมัติก่อนที่จะเผยแพร่ ( npm publish) prepublishนี้เดิมเรียกว่า ดูเหมือนว่า Npm คิดว่าจะสะดวกในการเรียกใช้prepublishสคริปต์บนไฟล์npm installเนื่องจากนั่นเป็นวิธีมาตรฐานในการเริ่มต้นสภาพแวดล้อมการพัฒนา

สิ่งนี้นำไปสู่ความสับสนครั้งใหญ่ในชุมชน github มีปัญหายาวมากเกี่ยวกับเรื่องนี้

ในท้ายที่สุดด้วยความพยายามที่จะไม่เปลี่ยนพฤติกรรมเก่าพวกเขาจึงตัดสินใจเพิ่มสคริปต์อัตโนมัติอีกสองสคริปต์: prepublishOnlyและprepareและ

prepublishOnlyทำในสิ่งที่คุณคาดหวัง มันไม่ทำงานnpm installมันไม่ได้ทำงานบนผู้ดูแลแพคเกจหลายคนเปลี่ยนมาใช้สิ่งนี้โดยสุ่มสี่สุ่มห้า

แต่ก็มีปัญหานี้เช่นกันที่ผู้คนไม่ต้องการพึ่งพา npmjs.com ในการแจกจ่ายแพ็คเกจเวอร์ชันต่างๆ ที่เก็บ Git เป็นทางเลือกที่เป็นธรรมชาติ อย่างไรก็ตามเป็นเรื่องปกติที่จะไม่ส่งไฟล์ที่ "คอมไพล์" เข้าคอมไพล์ นั่นคือสิ่งที่prepareเพิ่มเข้ามาเพื่อจัดการ ...

prepare เป็นวิธีที่ถูกต้อง

หากคุณมีที่เก็บที่มีไฟล์ต้นฉบับ แต่จำเป็นต้องใช้ขั้นตอน "build" ให้
prepareทำตามที่คุณต้องการในทุกกรณี (ณ เวลา npm 4)

prepare: เรียกใช้ทั้งสองอย่างก่อนที่แพ็กเกจจะบรรจุและเผยแพร่บนโลคัลnpm installโดยไม่มีข้อโต้แย้งใด ๆ และเมื่อติดตั้งการอ้างอิง git

คุณสามารถใส่การอ้างอิงการสร้างของคุณลงในdevDependenciesและจะถูกติดตั้งก่อนที่prepareจะดำเนินการ

นี่คือตัวอย่างแพ็คเกจของฉันที่ใช้วิธีนี้


ปัญหาเกี่ยวกับ .gitignore

มีปัญหาหนึ่งเกี่ยวกับตัวเลือกนี้ที่ได้รับหลายคน เมื่อเตรียมการอ้างอิง Npm และ Yarn จะเก็บเฉพาะไฟล์ที่ระบุไว้ในfilesส่วนของpackage.json.

อาจมีคนเห็นว่าfilesค่าเริ่มต้นของไฟล์ทั้งหมดที่รวมอยู่และคิดว่าเสร็จแล้ว สิ่งที่พลาดได้ง่ายคือ.npmignore ส่วนใหญ่จะลบล้างfilesคำสั่งและถ้า.npmignoreไม่มีอยู่.gitignoreจะใช้แทน

ดังนั้นหากคุณมีไฟล์ในตัวอยู่ในรายการ.gitignoreเหมือนคนมีสติและอย่าทำอย่างอื่นprepareจะดูเหมือนเสีย

หากคุณแก้ไขfilesเพื่อรวมเฉพาะไฟล์ที่สร้างขึ้นหรือเพิ่มไฟล์ว่าง.npmignoreคุณก็พร้อมแล้ว

คำแนะนำของฉันคือการตั้งค่าfiles(หรือโดยการผกผัน.npmignore) เพื่อให้ไฟล์เดียวที่เผยแพร่จริงเป็นไฟล์ที่ต้องการโดยผู้ใช้แพ็คเกจที่เผยแพร่ อิมโฮไม่จำเป็นต้องรวมแหล่งข้อมูลที่ไม่ได้คอมไพล์ไว้ในแพ็คเกจที่เผยแพร่


คำตอบเดิม: https://stackoverflow.com/a/57503862/4612476


1
PREPARE ทำงานให้ฉันแทน POSTINSTALL ฉันเพิ่งรัน npm run build in เตรียม
Milind

6

สำหรับ piggyback จากคำตอบที่ยอดเยี่ยมของ @ RyanZim postinstallเป็นตัวเลือกที่ถูกต้องสำหรับสิ่งนี้

เลือกทำอย่างใดอย่างหนึ่งต่อไปนี้:

  1. อัปเดต package.json ใน repo ที่แยกของคุณเพื่อเพิ่มองค์ประกอบ postinstall ในสคริปต์ ที่นี่ให้เรียกใช้สิ่งที่คุณต้องการเพื่อให้ได้ผลลัพธ์ที่คอมไพล์แล้ว (ต้องการ)
  2. อัพเดต package.json ของคุณและเพิ่ม postinstall ที่อัพเดตไดเร็กทอรีที่จำเป็นใน node_modules

หากคุณได้แยกที่เก็บข้อมูลของบุคคลอื่นอาจเป็นการดีที่จะยกปัญหาเพื่อแสดงให้เห็นถึงปัญหาที่ว่าการติดตั้งแพ็กเกจผ่าน GitHub ไม่ได้ผลเนื่องจากไม่ได้ให้วิธีการที่จำเป็นในการสร้างสคริปต์ จากนั้นพวกเขาสามารถยอมรับ PR เพื่อแก้ไขปัญหานี้ด้วย postinstall หรือปฏิเสธก็ได้และคุณสามารถทำ # 2 ได้


คุณสามารถอธิบายหรือมีแหล่งข้อมูลเกี่ยวกับวิธีการทำ # 2 ได้หรือไม่? คำสั่งใดที่ฉันต้องเรียกใช้หลังจากติดตั้ง npm เมื่อ gitrepo มีเฉพาะ src ไม่ใช่ dist
Daniel

1
@ แดเนียลขอโทษฉันพยายามจำบริบทที่ฉันทำสิ่งนี้ในอดีต ฉันคิดว่าใน # 2 ฉันตั้งใจจะเพิ่มขั้นตอน postinstall ลงในแพ็คเกจหลักของคุณ json ซึ่งจะเรียกใช้ขั้นตอนสำหรับคำตอบยอดนิยมดังนั้นบางสิ่งตามบรรทัด"postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"เพื่อให้แน่ใจว่าแพคเกจที่ทำให้คุณเกิดปัญหานั้นถูกสร้างขึ้นก่อนที่แอปพลิเคชันของคุณจะทำงาน ตามที่กล่าวไว้ฉันชอบวิธีการปลอม repo ให้กับผู้ใช้ของฉันเองเพิ่ม postinstall ลงในแพ็คเกจและใช้ในแอปพลิเคชันของฉัน
Mike B

ฉันคิดว่าควรเพิ่มการจัดเตรียม (คำตอบของ @ Simon) เพราะถ้าติดตั้งจาก npm คุณไม่จำเป็นต้องสร้างสิ่งปลูกสร้างใด ๆ เพิ่มเติมเพราะควรมี dist / dir อยู่แล้ว ดูdocs.npmjs.com/misc/scripts : "จัดเตรียม: เรียกใช้ทั้งสองอย่างก่อนที่แพ็กเกจจะบรรจุและเผยแพร่ ... และเมื่อติดตั้งการพึ่งพาคอมไพล์"
Tyler Rick

postinstallเป็นขั้นตอนเดียวที่สั้นของวิธีแก้ปัญหาที่เหมาะสม เพียงแค่ใช้prepare. เป็นปี 2020
Cameron Tacklind

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