ตัวเลือกการพึ่งพาเป็น npm?


23

ฉันมีคำถามที่คล้ายกันนี้แต่ไม่เหมือนกัน

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

ฉันรู้ว่าฉันสามารถทำได้เพื่อจุดประสงค์ในการพัฒนาdevDependenciesแต่สิ่งนี้ยิ่งไปกว่านั้น ดังที่คำตอบในคำถามข้างต้นกล่าวว่านี่เกี่ยวข้องกับโปรไฟล์setuptools extras_requireของPython และ Clojure leiningenมากขึ้น มีอะไรแบบนั้นในเวลา 23.00 น. ฉันรู้สึกว่าdevDependenciesควรเป็นdevโปรไฟล์ของวิธีที่หลากหลายในการระบุการพึ่งพา


แค่คิด แต่คุณสามารถไปกับแพ็คเกจที่หลากหลายได้ MyPackage-Core MyPackage-Db-Mongo MyPackage-Db-Redisฯลฯ ... มากที่พวกเขาวิธีที่ผู้คนไม่โมดูลซุ้มที่มีความหมายที่จะขยาย angularjs
Mike

@ ไมค์: อืมขอบคุณฉันจะพิจารณามัน ฉันยังคิดว่านี่เป็นข้อ จำกัดpackage.jsonที่ได้รับการแก้ไขในตัวจัดการแพคเกจอื่น ๆ
imiric

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

คำตอบ:


9

โมดูลพึ่งพาอาจจะเป็นสิ่งที่คุณกำลังมองหาหรือสิ่งที่ไม่สิ่งที่คล้ายกับ:

  • ประกาศตัวเลือกการพึ่งพาในpackage.jsonที่ไม่ได้ติดตั้งโดยอัตโนมัติโดยnpm installพูดoptionalPeerDependencies
  • ที่กำหนดเองrequireฟังก์ชั่นสไตล์ที่รู้เกี่ยวกับoptionalPeerDependenciesและไม่สิ่งที่ถูกต้องรวมถึงการขว้างปา / เตือนเมื่อไม่มีอะไรจะพบว่าการตอบสนองระดับที่จำเป็นของโมดูล (เช่นค่าredisหรือmongoไม่mysqlฯลฯ มีการติดตั้ง)
  • จัดทำเอกสารความคาดหวังที่ผู้บริโภคของโมดูลนี้ติดตั้งอย่างน้อย 1 ในโมดูลทางเลือกที่เป็นตัวเลือก

รูปแบบหนึ่งอาจเกิดขึ้นได้หากฟังก์ชันการทำงานหลักของโมดูลทำงานโดยไม่มีการพึ่งพาตัวเลือกใด ๆ (เช่นรูปแบบปลั๊กอิน) ไม่มีข้อผิดพลาด / คำเตือนเมื่อไม่พบสิ่งใดที่ตรงตามการพึ่งพาจากเพื่อน

รูปแบบหนึ่งคือการทำรายการดังกล่าวข้างต้นในขณะที่บัญชีสำหรับการผลิตเมื่อเทียบกับการอ้างอิงการพัฒนาคืออนาล็อกสำหรับและdependenciesdevDependencies

บางทีอาจรวมกับความต้องการตามต้องการซึ่งจำเป็นต้องมีโมดูลเสริมอย่างขี้เกียจเช่น:

exports = {
    Core : require('./core'),
    get redis(){ return require('./redis'); },
    get mongo(){ return require('./mongo'); }
}

ฉันไม่ได้ต้องการสิ่งนี้มาระยะหนึ่งแล้ว แต่ฉันคิดว่ามันแก้ปัญหาที่ฉันมีได้ ขอบคุณ!
imiric

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

9

หากคุณต้องการการพึ่งพาแบบง่าย ๆ เช่นปลั๊กอินเช่นถ้าคุณติดตั้ง foo คุณจะเรียกใช้มันมีสีสัน แต่ถ้าไม่ได้ติดตั้งคุณจะไม่มีปัญหาใด ๆ และเห็นเป็นสีเทาคุณสามารถใช้optionalDependecies ใน package.json :

{
  "name": "watchit",
  "version": "1.2.3",
  "optionalDependencies": {
    "foo": "^2.0.0"
  }
}

และในรหัส:

try {
  var foo = require('foo')
  var fooVersion = require('foo/package.json').version
} catch (er) {
  foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
  foo = null
}

// .. then later in your program ..

if (foo) {
  foo.doFooThings()
}

สกัดจากเอกสาร package.json


1

สิ่งที่ฉันทำคือการกำหนดค่าสคริปต์การติดตั้งใน package.json ของฉันภายในscriptsเช่นนี้:

"install": "node ./my-tools/my-install.js",

มันจะทำงานทันทีหลังจากnpm installเสร็จสิ้น ฉันใช้เป็นส่วนใหญ่สำหรับการสร้าง.envไฟล์ที่มีค่าเริ่มต้นโดยอัตโนมัติ

my-install.jsสคริปต์สามารถเรียกใช้คำสั่งที่แตกต่างกันในการสร้างไฟล์ขอท่านผู้ใช้จึงมีคุณอาจจะบอกว่า "ต้องการ Redis หรือ Mongo?":

const exec = require('child_process').exec;
const readline = require('readline');

// Insert "Ask question script" here
// using readline core module

if ( option == 'mongo' )
  exec('npm install mongoose');

if ( option == 'redis' )
  exec('npm install redis');

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

โปรดสังเกตว่าสคริปต์การติดตั้งอาจเป็นสิ่งที่คุณต้องการ (python, bash, ฯลฯ )


2
การขอให้ผู้ใช้ป้อนข้อมูลจะทำให้การสร้างอัตโนมัติขึ้น การทำงานnpm installอีกครั้งภายในสคริปต์ติดตั้งอาจทำให้เกิดพฤติกรรมที่ไม่ตั้งใจ ฉันไม่แนะนำวิธีแก้ปัญหานี้
แลมบ์ดาแฟรี่

1

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

แพ็คเกจของฉันคือinstall-subsetและสามารถติดตั้งได้ทั่วโลกด้วยnpm install -g install-subset

https://www.npmjs.com/package/install-subset

ขั้นแรกให้คุณสร้างบัญชีขาวและบัญชีดำสำหรับเซ็ตย่อยการติดตั้งที่ระบุชื่อในแพ็คเกจ.jsonดังนี้:

"subsets": {
    "build": {
        "whitelist": [
            "babel-cli",
            "dotenv"
        ]
    },
    "test": {
        "blacklist": [
            "eslint",
            "lint-rules",
            "prettier"
        ]
    }
}

จากนั้นโทรหาด้วย install-subset test

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

ยังทำงานร่วมกับเส้นด้ายเป็นโอเพนซอร์สและยินดีต้อนรับปัญหา / / PR

ในหลายกรณีฉันใช้สิ่งนี้บนเซิร์ฟเวอร์ ci ของเราเพื่อลดเวลาในการสร้างและในโปรเจ็กต์ React Native ล่าสุดเราได้ทำการติดตั้งผู้พัฒนาระบบใหม่จาก 72 วินาทีเป็น 20 วินาที

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