จะแก้ไขโมดูลโหนดที่ติดตั้งผ่าน npm ได้อย่างไร?


125

ฉันใช้โมดูล node_swiz ซึ่งจะใช้โมดูลตัวตรวจสอบความถูกต้อง

ฉันต้องการเปลี่ยนแปลงโมดูลตัวตรวจสอบความถูกต้อง แต่ฉันใช้การติดตั้ง npm เพื่อติดตั้งโมดูล / การอ้างอิง

ฉันสามารถทำการเปลี่ยนแปลงโมดูลตรวจสอบความถูกต้องภายใน node_modules ได้หรือไม่หรือจะสร้างการอ้างอิง node_modules ขึ้นใหม่และเวอร์ชันล่าสุดจะได้รับเมื่อฉันเผยแพร่ไปยัง heroku หรือในครั้งต่อไปที่ฉันเรียกใช้การติดตั้ง npm

โครงสร้างมีลักษณะดังนี้:

myNodeApplication
  - node_modules
     - swiz
         - node_modules
            - validator [this is the library I want to edit]

ขอบคุณสำหรับความช่วยเหลือ!

คำตอบ:


244

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

หากการเปลี่ยนแปลงมีผลต่อการทำงานของโมดูลโดยรวมและอาจเป็นประโยชน์กับผู้อื่นคุณอาจต้องการมีส่วนร่วมกับแหล่งข้อมูลดั้งเดิมบน github และมองหาการเปลี่ยนแปลงที่จะนำไปใช้

หากนี่เป็นฟังก์ชันที่เป็นกรรมสิทธิ์ซึ่งจำเป็นและจะไม่ช่วยในการพัฒนาโมดูลสิ่งที่ดีที่สุดที่ควรทำคือแยกมันออกจาก github และทำการเปลี่ยนแปลงของคุณ คุณสามารถติดตั้งไอเท็มได้โดยตรงจาก github โดยใช้ NPM และวิธีนี้จะช่วยให้คุณรวมการเปลี่ยนแปลงในอนาคตเข้ากับเวอร์ชันที่กำหนดเองของคุณจากแหล่งต้นฉบับ

ในการติดตั้งโดยตรงจาก github ให้ใช้คำสั่งต่อไปนี้:

npm install https://github.com/<username>/<repository>/tarball/master


2
ขอบคุณ! นั่นคือสิ่งที่ฉันอยากรู้ นอกจากนี้สำหรับคนอื่น ๆ ที่อ่านสิ่งนี้ ... ฉันต้องการรวมโมดูลที่อยู่ใน github ของฉันไว้ในไฟล์ package.json และมีข้อมูลเกี่ยวกับสิ่งนั้นอยู่ที่นี่: stackoverflow.com/a/8306715/1810875
user1810875

22
ก่อนที่จะทำการฟอร์กฉันกำลังเปลี่ยนมันในระบบภายใน แต่ดูเหมือนว่าการเปลี่ยนแปลงจะไม่ส่งผล การเปลี่ยนไฟล์ javascript ซึ่งเป็น node_modules / package_name / lib / file_name.js จะส่งผลกระทบหรือไม่
อยากรู้อยากเห็น

1
เพียงบันทึกไม่แน่ใจว่ามีอะไรเปลี่ยนแปลงไปหรือไม่ แต่โดยส่วนตัวฉันต้องระบุ Git URL เป็น git: //github.com/ <user> / <package> .git "
Craig

5
@JohnDevor แทนที่จะติดตั้งโมดูลที่กำหนดเองให้ใช้คำสั่ง "npm link" เพื่อสร้าง sym-link ไปยังโฟลเดอร์: docs.npmjs.com/cli/link
Venryx

3
คิดออกฉันต้องไปที่โฟลเดอร์ใน/node_modulesและเรียกใช้npm installจากนั้นทุกอย่างก็เรียบร้อย!
Adam Moisa

9

คุณสามารถใช้patch-packageเพื่อทำการเปลี่ยนแปลงและคงอยู่ในโมดูลโหนด

สามารถทำได้โดยทำการเปลี่ยนแปลงแพ็คเกจภายในnode_modulesก่อนจากนั้นเรียกใช้คำสั่งต่อไปนี้โดย<package name>เป็นชื่อของแพ็คเกจที่คุณเพิ่งทำการเปลี่ยนแปลง

npx patch-package <package name>

patch-package จะสร้างpatchesโฟลเดอร์ที่มีไฟล์อยู่ข้างในซึ่งแสดงถึงการเปลี่ยนแปลงของคุณ จากนั้นไฟล์นี้สามารถคอมมิตเข้ากับคอมไพล์และสามารถกู้คืนแพตช์ได้ในภายหลังโดยการรันnpx patch-package(โดยไม่มีข้อโต้แย้งใด ๆ )

ขั้นตอนเพิ่มเติม:

เพิ่มสิ่งต่อไปนี้ในส่วนสคริปต์ของ package.json ของคุณเพื่อแก้ไขการอ้างอิงโดยอัตโนมัติเมื่อคุณดำเนินการ "npm install"

"postinstall": "npx patch-package" 

1
ทางออกที่ดีมากซึ่งใช้ได้กับฉันโดยไม่มีปัญหาใด ๆ
ヨハンソン

มันเจ๋งมาก! FYI: ฉันต้องใช้ "preinstall" แทน "postinstall" เนื่องจากโปรแกรมแก้ไขของฉันใช้สคริปต์ postinstall ของการอ้างอิง คุณจะนำไปใช้อย่างไรหากคุณมีโปรแกรมแก้ไขอื่น ๆ ที่จำเป็นต้องใช้ในขั้นตอนหลังการติดตั้ง
Superole

1
คำตอบที่เหลือเชื่อฉันต้องทำการปรับเปลี่ยน Dep ก่อนที่จะปรับใช้กับ netlify การติดตั้ง 'npx patch-package' ล่วงหน้าเป็นตั๋ววิเศษ ขณะนี้ภาพที่เหมาะสมปรากฏบนเว็บไซต์
TheBetterJORT

1

ฉันไม่ต้องการเผยแพร่โมดูลใหม่และฉันก็ไม่ต้องการnpm installเขียนทับการเปลี่ยนแปลงของฉันด้วย ฉันพบวิธีแก้ไขปัญหาทั้งสองนี้ แต่อาจจะดีกว่าถ้ารับคำแนะนำของ @ Sdedelbrock แต่ถ้าคุณต้องการดำเนินการดังต่อไปนี้:

  1. แก้ไขpackage.jsonไฟล์ของคุณเพื่อลบการอ้างอิงที่คุณต้องการแก้ไข
  2. เข้าไปในโปรเจ็กต์ของคุณ/node_modulesและย้ายโฟลเดอร์ไปที่อื่นในที่เก็บของคุณที่สามารถตกลงกันได้ ตอนนี้/node_modules/dependencyอยู่ที่/dependency
  3. cd ลงในไดเร็กทอรีการพึ่งพาและพิมพ์ npm link
  4. cdลงในรูทของไดเร็กทอรีโปรเจ็กต์ของคุณและพิมพ์npm link dependency สิ่งสำคัญคือคุณต้องทำสิ่งนี้ภายนอก/node_modulesและ/dependency

หากทุกอย่างใช้งานได้ตอนนี้คุณควรมี symlink ที่สร้างขึ้นใน/node_modules/dependency. ตอนนี้คุณสามารถเรียกใช้โครงการของคุณเพื่อดูว่าทำงานได้หรือไม่

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