การใช้โมดูลโหนดที่แบ่งใช้สำหรับคลาสทั่วไป


15

เป้าหมาย

ดังนั้นฉันจึงมีโครงการที่มีโครงสร้างนี้:

  • อิออนแอป
  • Firebase ฟังก์ชั่น
  • ที่ใช้ร่วมกัน

เป้าหมายคือการกำหนดอินเตอร์เฟสและคลาสทั่วไปในsharedโมดูล

ข้อ จำกัด

ฉันไม่ต้องการอัปโหลดรหัสของฉันไปยัง npm เพื่อใช้งานในพื้นที่และฉันไม่ได้วางแผนที่จะอัปโหลดรหัสเลย ควรทำงาน 100% ออฟไลน์

ในขณะที่กระบวนการพัฒนาควรทำงานแบบออฟไลน์โมดูลionic-appและfirebase-functionsกำลังจะถูกปรับใช้กับ firebase (การโฮสต์และฟังก์ชัน) ดังนั้นรหัสจากsharedโมดูลควรจะมีอยู่ที่นั่น

สิ่งที่ฉันได้ลองมาแล้ว

  • ฉันได้ลองใช้Project Referencesใน typescript แล้ว แต่ฉันยังไม่ได้ทำงาน
  • ฉันลองด้วยการติดตั้งเป็นโมดูล npm เหมือนในคำตอบที่สองของคำถามนี้
    • ดูเหมือนว่าจะทำงานได้ดีในตอนแรก แต่ในระหว่างการสร้างฉันได้รับข้อผิดพลาดเช่นนี้เมื่อทำงานfirebase deploy:
Function failed on loading user code. Error message: Code in file lib/index.js can't be loaded.
Did you list all required modules in the package.json dependencies?
Detailed stack trace: Error: Cannot find module 'shared'
    at Function.Module._resolveFilename (module.js:548:15)
    at Function.Module._load (module.js:475:25)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/srv/lib/index.js:5:18)

คำถาม

คุณมีวิธีแก้ปัญหาสำหรับการสร้างโมดูลที่แบ่งใช้โดยใช้ typescripts config หรือ NPM หรือไม่?

โปรดอย่าทำเครื่องหมายสิ่งนี้ว่าซ้ำ→ฉันลองใช้วิธีแก้ไขปัญหาใด ๆ ที่พบใน StackOverflow

ข้อมูลเพิ่มเติม

กำหนดค่าสำหรับแบ่งปัน:

// package.json
{
  "name": "shared",
  "version": "1.0.0",
  "description": "",
  "main": "dist/src/index.js",
  "types": "dist/src/index.d.ts",
  "files": [
    "dist/src/**/*"
  ],
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "publishConfig": {
    "access": "private"
  }
}

// tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "rootDir": ".",
    "sourceRoot": "src",
    "outDir": "dist",
    "sourceMap": true,
    "declaration": true,
    "target": "es2017"
  }
}

กำหนดค่าสำหรับฟังก์ชั่น:

// package.json
{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "8"
  },
  "main": "lib/index.js",
  "dependencies": {
    "firebase-admin": "^8.0.0",
    "firebase-functions": "^3.1.0",
    "shared": "file:../../shared"
  },
  "devDependencies": {
    "@types/braintree": "^2.20.0",
    "tslint": "^5.12.0",
    "typescript": "^3.2.2"
  },
  "private": true
}


// tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "./",
    "module": "commonjs",
    "noImplicitReturns": true,
    "noUnusedLocals": false,
    "rootDir": "src",
    "outDir": "lib",
    "sourceMap": true,
    "strict": true,
    "target": "es2017"
  }
}

soution ปัจจุบัน

ฉันได้เพิ่มสคริปต์ npm ไปยังโมดูลที่ใช้ร่วมกันซึ่งคัดลอกไฟล์ทั้งหมด (ไม่มี index.js) ไปยังโมดูลอื่น นี่เป็นปัญหาที่ฉันตรวจสอบรหัสที่ซ้ำกันใน SCM และฉันต้องเรียกใช้คำสั่งนั้นในการเปลี่ยนแปลงทุกครั้ง นอกจากนี้ IDE ยังถือว่าเป็นไฟล์อื่น

คำตอบ:


4

คำนำ:ฉันไม่คุ้นเคยกับการรวบรวม typescript และวิธีการpackage.jsonกำหนดโมดูล วิธีแก้ปัญหานี้ถึงแม้ว่าจะได้ผล แต่ก็ถือได้ว่าเป็นวิธีการแฮ็คที่ประสบความสำเร็จในงาน

สมมติว่าโครงสร้างไดเรกทอรีต่อไปนี้:

project/
  ionic-app/
    package.json
  functions/
    src/
      index.ts
    lib/
      index.js
    package.json
  shared/
    src/
      shared.ts
    lib/
      shared.js
    package.json

เมื่อปรับใช้บริการ Firebase คุณสามารถแนบคำสั่งไปยังpredeploy และ postdeploy ตะขอ สิ่งนี้ทำfirebase.jsonผ่านคุณสมบัติpredeployและpostdeployบริการที่ต้องการ คุณสมบัติเหล่านี้มีอาร์เรย์ของคำสั่งตามลำดับที่จะรันก่อนและหลังการปรับใช้โค้ดของคุณตามลำดับ นอกจากนี้คำสั่งเหล่านี้จะถูกเรียกพร้อมกับตัวแปรสภาพแวดล้อมRESOURCE_DIR(เส้นทางไดเรกทอรีของ./functionsหรือ./ionic-appใดก็ตามที่เกี่ยวข้อง) และPROJECT_DIR(เส้นทางไดเรกทอรีที่มีfirebase.json)

การใช้predeployอาร์เรย์functionsภายในfirebase.jsonเราสามารถคัดลอกรหัสของไลบรารีที่แชร์ไปยังโฟลเดอร์ที่ปรับใช้กับอินสแตนซ์ของ Cloud Function โดยการทำเช่นนี้คุณสามารถรวมรหัสที่ใช้ร่วมกันราวกับว่ามันเป็นไลบรารีที่อยู่ในโฟลเดอร์ย่อยหรือคุณสามารถแมปชื่อของมันโดยใช้การแมปเส้นทางของ typescriptในtsconfig.jsonโมดูลชื่อ (เพื่อให้คุณสามารถใช้import { hiThere } from 'shared';)

predeployนิยามเบ็ด (ใช้ทั่วโลกติดตั้งshxสำหรับ Windows เข้ากันได้):

// firebase.json
{
  "functions": {
    "predeploy": [
      "shx rm -rf \"$RESOURCE_DIR/src/shared\"", // delete existing files
      "shx cp -R \"$PROJECT_DIR/shared/.\" \"$RESOURCE_DIR/src/shared\"", // copy latest version
      "npm --prefix \"$RESOURCE_DIR\" run lint", // lint & compile
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ]
  },
  "hosting": {
    "public": "ionic-app",
    ...
  }
}

การลิงก์ซอร์ส typescript ของไลบรารีที่คัดลอกไปยัง config compiler ของฟังก์ชั่น typescript:

// functions/tsconfig.json
{
  "compilerOptions": {
    ...,
    "baseUrl": "./src",
    "paths": {
      "shared": ["shared/src"]
    }
  },
  "include": [
    "src"
  ],
  ...
}

การเชื่อมโยงชื่อโมดูล "shared" กับโฟลเดอร์แพ็กเกจของไลบรารีที่คัดลอก

// functions/package.json
{
  "name": "functions",
  "scripts": {
    ...
  },
  "engines": {
    "node": "8"
  },
  "main": "lib/index.js",
  "dependencies": {
    "firebase-admin": "^8.6.0",
    "firebase-functions": "^3.3.0",
    "shared": "file:./src/shared",
    ...
  },
  "devDependencies": {
    "tslint": "^5.12.0",
    "typescript": "^3.2.2",
    "firebase-functions-test": "^0.1.6"
  },
  "private": true
}

วิธีการเดียวกันสามารถใช้กับโฟลเดอร์การโฮสต์


หวังว่านี่จะเป็นแรงบันดาลใจให้คนที่คุ้นเคยกับการรวบรวม typescript มากขึ้นเพื่อหาโซลูชันที่สะอาดกว่าซึ่งใช้ประโยชน์จาก hooks เหล่านี้


3

คุณอาจต้องการลองLernaซึ่งเป็นเครื่องมือสำหรับการจัดการโครงการ JavaScript (และ TypeScript) ด้วยแพ็คเกจจำนวนมาก

ติดตั้ง

สมมติว่าโครงการของคุณมีโครงสร้างไดเรกทอรีดังต่อไปนี้:

packages
  ionic-app
    package.json
  firebase-functions
    package.json
  shared
    package.json

ตรวจสอบให้แน่ใจว่าระบุระดับการเข้าถึง ( privateและconfig/accessปุ่ม) ที่ถูกต้องในโมดูลทั้งหมดที่คุณไม่ต้องการเผยแพร่รวมถึงtypingsรายการในsharedโมดูลของคุณ:

ใช้ร่วมกัน:

{
  "name": "shared",
  "version": "1.0.0",
  "private": true,
  "config": {
    "access": "private"
  },
  "main": "lib/index.js",
  "typings": "lib/index.d.ts",
  "scripts": {
    "compile": "tsc --project tsconfig.json"
  }
}

อิออนแอป

{
  "name": "ionic-app",
  "version": "1.0.0",
  "private": true,
  "config": {
    "access": "private"
  },
  "main": "lib/index.js",
  "scripts": {
    "compile": "tsc --project tsconfig.json"
  },
  "dependencies": {
    "shared": "1.0.0"
  }
}

ด้วยการเปลี่ยนแปลงข้างต้นคุณสามารถสร้างระดับรูทpackage.jsonซึ่งคุณสามารถระบุสิ่งdevDependenciesที่คุณต้องการให้โมดูลโครงการทั้งหมดของคุณมีการเข้าถึงเช่นกรอบการทดสอบหน่วยของคุณ tslint เป็นต้น

packages
  ionic-app
    package.json
  firebase-functions
    package.json
  shared
    package.json
package.json         // root-level, same as the `packages` dir

คุณยังสามารถใช้ระดับรูทนี้package.jsonเพื่อกำหนดสคริปต์ npm ที่จะเรียกใช้สคริปต์ที่เกี่ยวข้องในโมดูลของโครงการของคุณ (ผ่าน lerna):

{
  "name": "my-project",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "compile": "lerna run compile --stream",
    "postinstall": "lerna bootstrap",
  },
  "devDependencies": {
    "lerna": "^3.18.4",
    "tslint": "^5.20.1",
    "typescript": "^3.7.2"
  },
}

เมื่อติดตั้งแล้วให้เพิ่มไฟล์ config lerna ในไดเรกทอรีรากของคุณ:

packages
  ionic-app
    package.json
  firebase-functions
    package.json
  shared
    package.json
package.json
lerna.json

มีเนื้อหาดังต่อไปนี้:

{
  "lerna": "3.18.4",
  "loglevel": "info",
  "packages": [
    "packages/*"
  ],
  "version": "1.0.0"
}

ตอนนี้เมื่อคุณทำงานnpm installในไดเรกทอรีรากที่postinstallสคริปต์ที่กำหนดไว้ในระดับรากของคุณจะเรียกpackage.jsonlerna bootstrap

อะไรคือสิ่งlerna bootstrapที่มันจะเชื่อมsharedโมดูลของคุณเข้ากับionic-app/node_modules/sharedและfirebase-functions/node_modules/sharedจากจุดของโมดูลทั้งสองนั้นsharedจะดูเหมือนกับโมดูล npm อื่น ๆ

การรวบรวม

แน่นอนว่าการลิงก์โมดูลนั้นไม่เพียงพอเนื่องจากคุณยังต้องรวบรวมจาก TypeScript ไปยัง JavaScript

นั่นคือสิ่งที่package.json compileสคริปต์ระดับรากเข้ามาเล่น

เมื่อคุณรันnpm run compileในรูทโปรเจ็กต์ของคุณเอ็นพีเอ็มพีจะเรียกใช้lerna run compile --streamและlerna run compile --streamเรียกใช้สคริปต์ที่เรียกว่าcompileในpackage.jsonไฟล์โมดูลแต่ละไฟล์ของคุณ

เนื่องจากแต่ละโมดูลของคุณมีcompileสคริปต์ของตัวเองคุณควรมีtsonfig.jsonไฟล์ต่อโมดูล หากคุณไม่ชอบการทำซ้ำคุณสามารถหลีกเลี่ยง tsconfig ระดับรากหรือการรวมกันของ tsconfig ระดับรากและไฟล์ tsconfig ระดับโมดูลที่สืบทอดจาก root หนึ่ง

หากคุณต้องการที่จะดูว่าการตั้งค่านี้ทำงานอย่างไรในโครงการในโลกแห่งความเป็นจริงลองดูที่Serenity / JSที่ฉันใช้มันอย่างกว้างขวาง

การปรับใช้

สิ่งที่ดีเกี่ยวกับการมีsharedโมดูล symlinked ภายnode_modulesใต้firebase-functionsและionic-appและdevDepedenciesภายnode_modulesใต้โครงการของคุณภายใต้รูทคือถ้าคุณต้องการปรับใช้โมดูลผู้บริโภคที่ใดก็ได้ ( ionic-appเช่นตัวอย่าง) คุณเพียงแค่ซิปมันทั้งหมดเข้าด้วยกันnode_modulesและไม่ต้องกังวล ต้องลบการพึ่งพา dev ก่อนการปรับใช้

หวังว่านี่จะช่วยได้!

ม.ค.


intresting! ฉันจะตรวจสอบอย่างละเอียดและดูว่านี่เหมาะสมหรือไม่
MauriceNino

2

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

นำไปใช้กับกรณีการใช้งานของคุณ:

  1. พุชเวอร์ชันปัจจุบันของ shared-git-repository ของคุณ
  2. ใช้git submodule add <shared-git-repository-link>ภายในโครงการหลักของคุณเพื่อเชื่อมโยงพื้นที่เก็บข้อมูลที่ใช้ร่วมกัน

นี่คือลิงค์ไปสู่เอกสาร: https://git-scm.com/docs/git-submodule


อันที่จริงแล้วมันไม่ได้เป็นความคิดที่ดี แต่การพัฒนาและการทดสอบในท้องถิ่นนั้นได้หายไปจากแนวทางนี้
MauriceNino

0

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

วิธีที่ 1: สำเนาในเครื่อง

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

วิธีที่ 2: Monorepo

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

วิธีที่ 3: ส่วนประกอบ

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

วิธีที่ 4: แพ็คเกจ

คุณบอกเป็นพิเศษว่าคุณไม่ต้องการใช้ NPM แต่ฉันต้องการแบ่งปันเพราะขณะนี้ฉันกำลังทำงานกับการตั้งค่าตามที่อธิบายไว้ด้านล่างและกำลังทำงานที่สมบูรณ์แบบสำหรับฉัน:

  1. ใช้npmหรือyarnเพื่อสร้างแพคเกจสำหรับแต่ละโฟลเดอร์ (คุณสามารถสร้างแพ็คเกจที่กำหนดขอบเขตสำหรับทั้งสองโฟลเดอร์เพื่อให้โค้ดใช้ได้เฉพาะกับคุณหากเป็นปัญหาของคุณ)
  2. ในโฟลเดอร์หลัก (ที่ใช้โฟลเดอร์เหล่านี้ทั้งหมด) แพคเกจที่สร้างขึ้นจะเชื่อมต่อเป็นการอ้างอิง
  3. ฉันใช้ webpack เพื่อรวมรหัสทั้งหมดโดยใช้นามแฝงของเส้นทาง webpack ร่วมกับเส้นทาง typescript

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

บันทึก

แพ็คเกจ 'child' ได้ถูกคอมไพล์แล้วในเคสของฉันเพราะมันค่อนข้างใหญ่และฉันได้สร้าง tsconfigs แยกต่างหากสำหรับแต่ละแพ็คเกจ แต่สิ่งที่สวยงามคือคุณสามารถเปลี่ยนมันได้อย่างง่ายดาย ในอดีตฉันเคยใช้ typescript ในโมดูลและไฟล์ที่คอมไพล์แล้วและไฟล์ raw js ดังนั้นสิ่งทั้งหมดนั้นหลากหลายมาก

หวังว่านี่จะช่วยได้

***** อัปเดต **** เพื่อดำเนินการต่อในจุดที่ 4: ฉันขอโทษที่ไม่ดีของฉัน บางทีฉันเข้าใจผิดเพราะเท่าที่ฉันรู้คุณไม่สามารถเชื่อมโยงโมดูลได้หากไม่ได้อัปโหลด อย่างไรก็ตามนี่คือ:

  1. คุณมีโมดูล npm แยกต่างหากมาใช้firebase-functionsเพื่อสิ่งนั้น คุณรวบรวมหรือใช้ raw ts ขึ้นอยู่กับความต้องการของคุณ
  2. ในโครงการแม่ของคุณเพิ่มfirebase-functionsเป็นการพึ่งพา
  3. ในtsconfig.jsonเพิ่ม"paths": {"firebase-functions: ['node_modules/firebase-functions']"}
  4. ใน webpack - resolve: {extensions: ['ts', 'js'], alias: 'firebase-functions': }

วิธีนี้คุณอ้างอิงฟังก์ชั่นการส่งออกทั้งหมดของคุณจากโมดูลง่ายๆโดยการใช้firebase-functions import { Something } from 'firebase-functions'Webpack และ TypeScript จะเชื่อมโยงไปยังโฟลเดอร์โมดูลโหนด ด้วยการกำหนดค่านี้โครงการหลักจะไม่สนใจว่าfirebase-functionsโมดูลจะถูกเขียนใน TypeScript หรือวานิลลาจาวาสคริปต์

เมื่อติดตั้งแล้วมันจะทำงานได้อย่างสมบูรณ์แบบสำหรับการผลิต จากนั้นไปที่ลิงก์และทำงานออฟไลน์:

  1. นำทางไปยังโครงการและการเขียนfirebase-functions npm linkมันจะสร้าง symlink ท้องถิ่นกับเครื่องของคุณและจะแมปลิงค์ชื่อที่คุณตั้งไว้ใน package.json
  2. นำทางไปยังโปรเจ็กต์หลักและเขียนnpm link firebase-functionsซึ่งจะสร้าง symlink และแม็พการพึ่งพาของ firebase-functions ไปยังโฟลเดอร์ที่คุณสร้างไว้

ฉันคิดว่าคุณเข้าใจผิดบางอย่าง ฉันไม่เคยบอกว่าฉันไม่ต้องการใช้ NPM อันที่จริงโมดูลทั้งสามนั้นเป็นโมดูลโหนด ฉันเพิ่งพูดว่าฉันไม่ต้องการอัปโหลดโมดูลของฉันไปยัง npm คุณสามารถอธิบายรายละเอียดในส่วนที่ 4 อีกเล็กน้อย - ฟังดูน่าสนใจใช่ไหม อาจมีตัวอย่างรหัสหรือไม่
MauriceNino

ฉันจะเพิ่มคำตอบอื่นตามที่มันจะมีความยาวและอ่านไม่ได้เป็นความคิดเห็น
อีวาน Dzhurov

อัปเดตคำตอบแรกของฉันหวังว่าชัดเจน
Ivan Dzhurov

0

ฉันไม่ต้องการอัปโหลดรหัสของฉันไปยัง npm เพื่อใช้งานในพื้นที่และฉันไม่ได้วางแผนที่จะอัปโหลดรหัสเลย ควรทำงาน 100% ออฟไลน์

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

ProGet เป็นเซิร์ฟเวอร์เก็บข้อมูลส่วนตัวของ NuGet / Npm ที่มีให้สำหรับ windows ซึ่งคุณสามารถใช้ในสภาพแวดล้อมการพัฒนา / การผลิตส่วนตัวเพื่อโฮสต์เข้าถึงและเผยแพร่แพ็คเกจส่วนตัวของคุณ แม้ว่าจะอยู่บน windows แต่ฉันแน่ใจว่ามีทางเลือกต่าง ๆ บน linux

  1. Git Submodules เป็นความคิดที่ไม่ดีจริง ๆ แล้วมันเป็นวิธีการแบบเก่าในการแบ่งปันรหัสซึ่งไม่ได้เป็นเวอร์ชันเหมือนแพ็คเกจที่มีการเปลี่ยนแปลงและการยอมรับ submodules เป็นความเจ็บปวดที่แท้จริง
  2. โฟลเดอร์การนำเข้าแหล่งที่มาเป็นความคิดที่ไม่ดีการกำหนดเวอร์ชันเป็นปัญหาอีกครั้งเพราะถ้ามีคนแก้ไขโฟลเดอร์ที่ต้องพึ่งพาในที่เก็บที่ขึ้นต่อกันการติดตามอีกครั้งก็เป็นฝันร้าย
  3. เครื่องมือสคริปต์ของบุคคลที่สามใด ๆ เพื่อจำลองการแยกแพคเกจจะเสียเวลาเนื่องจาก npm มีเครื่องมือมากมายให้จัดการแพ็กเกจได้ดี

นี่คือสถานการณ์สร้าง / ปรับใช้ของเรา

  1. ทุกแพ็คเกจส่วนตัวมี.npmrcสิ่งที่บรรจุregistry=https://private-npm-repositoryอยู่
  2. เราเผยแพร่แพคเกจส่วนตัวทั้งหมดของเราไปยังพื้นที่เก็บข้อมูล ProGet ของเรา
  3. ทุกแพ็คเกจส่วนตัวมีแพ็คเกจส่วนตัวที่ขึ้นอยู่กับ ProGet
  4. บิลด์เซิร์ฟเวอร์ของเราเข้าถึง ProGet ผ่านการตรวจสอบสิทธิ์ npm ที่เรากำหนดไว้ ไม่มีใครอยู่นอกเครือข่ายของเราที่เข้าถึงที่เก็บนี้
  5. บิวด์เซิร์ฟเวอร์ของเราสร้างแพคเกจ npm bundled dependenciesซึ่งมีแพ็คเกจทั้งหมดที่อยู่ภายในnode_modulesและเซิร์ฟเวอร์ที่ใช้งานจริงไม่จำเป็นต้องเข้าถึงแพ็คเกจ NPM หรือแพคเกจส่วนตัว NPM เนื่องจากแพ็คเกจที่จำเป็นทั้งหมดได้รับการรวมไว้แล้ว

การใช้ที่เก็บส่วนตัว npm มีข้อดีหลายประการ

  1. ไม่จำเป็นต้องใช้สคริปต์ที่กำหนดเอง
  2. พอดีกับโหนด buid / เผยแพร่ไปป์ไลน์
  3. แพคเกจส่วนตัว NPM ทุกคนจะมีลิงค์โดยตรงไปยังการควบคุมแหล่ง git ส่วนตัวของคุณง่ายต่อการแก้ปัญหาและตรวจสอบข้อผิดพลาดในอนาคต
  4. ทุกแพ็คเกจเป็นสแน็ปช็อตแบบอ่านอย่างเดียวดังนั้นเมื่อเผยแพร่ไม่สามารถแก้ไขได้และในขณะที่คุณกำลังสร้างคุณสมบัติใหม่ฐานรหัสที่มีอยู่กับแพ็คเกจที่ขึ้นต่อกันรุ่นเก่าจะไม่ได้รับผลกระทบ
  5. คุณสามารถทำให้บางแพ็กเกจเป็นสาธารณะและย้ายไปยังที่เก็บอื่น ๆ ในอนาคต
  6. หากซอฟต์แวร์ผู้ให้บริการ npm ส่วนตัวของคุณเปลี่ยนแปลงตัวอย่างเช่นคุณตัดสินใจย้ายรหัสของคุณไปยังคลาวด์รีจิสตรีแพ็กเกจ npm ส่วนตัวของโหนดคุณไม่จำเป็นต้องทำการเปลี่ยนแปลงใด ๆ กับโค้ดของคุณ

นี่อาจเป็นทางออก แต่ก็ไม่ใช่สำหรับฉัน ขอบคุณสำหรับเวลาของคุณ!
MauriceNino

นอกจากนี้ยังมีที่เก็บ npm โลคัลซึ่งติดตั้งเป็นโหนดเซิร์ฟเวอร์ขนาดเล็กverdaccio.org
Akash Kava

-1

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

นำไปใช้กับกรณีการใช้งานของคุณ:

  1. ใช้npm linkภายในsharedแพ็คเกจของคุณ นี่จะเป็นการกำหนดปลายทางของ symlink สำหรับการติดตั้งในอนาคต
  2. นำทางไปยังโครงการหลักของคุณ ข้างในfunctionsแพ็คเกจของคุณและใช้npm link sharedเพื่อเชื่อมโยงแพ็คเกจที่ใช้ร่วมกันและเพิ่มไปยังnode_modulesไดเรกทอรี

นี่คือลิงค์ไปสู่เอกสาร: https://docs.npmjs.com/cli/link.html


เท่าที่ฉันรู้ลิงค์ NPM มีไว้สำหรับการทดสอบเท่านั้นและไม่สามารถใช้งานได้หากคุณต้องการปรับใช้โค้ดที่ได้ (เช่นฟังก์ชั่นของฉัน)
MauriceNino

ฉันเห็นว่าคุณน่าจะเพิ่มข้อกำหนดนี้ในคำถามของคุณ
Friedow

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