Tor
Ich habe also ein Projekt mit dieser Struktur:
- ionic-app
- Firebase-Funktionen
- geteilt
Ziel ist es, gemeinsame Schnittstellen und Klassen im shared
Modul zu definieren .
Beschränkungen
Ich möchte meinen Code nicht auf npm hochladen, um ihn lokal zu verwenden, und habe nicht vor, den Code überhaupt hochzuladen. Es sollte zu 100% offline funktionieren.
Während der Entwicklungsprozess offline funktionieren sollte, werden die Module ionic-app
und firebase-functions
in der Firebase (Hosting & Funktionen) bereitgestellt. Daher sollte der Code aus dem shared
Modul dort verfügbar sein.
Was ich bisher versucht habe
- Ich habe versucht, Projektreferenzen in Typoskript zu verwenden, aber ich habe es nicht annähernd zum Laufen gebracht
- Ich habe es mit der Installation als npm-Modul versucht, wie in der zweiten Antwort auf diese Frage
- Es scheint zunächst gut zu funktionieren, aber während des Builds erhalte ich beim Ausführen
firebase deploy
folgende Fehlermeldung :
- Es scheint zunächst gut zu funktionieren, aber während des Builds erhalte ich beim Ausführen
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)
Frage
Haben Sie eine Lösung für die Erstellung eines gemeinsam genutzten Moduls mit Typescripts Config oder NPM?
Bitte markieren Sie dies nicht als Duplikat → Ich habe eine Lösung ausprobiert, die ich in StackOverflow gefunden habe.
Zusätzliche Information
Konfiguration für gemeinsam genutzte:
// 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"
}
}
Konfiguration für Funktionen:
// 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"
}
}
Aktuelle Lösung
Ich habe dem freigegebenen Modul ein npm-Skript hinzugefügt, das alle Dateien (ohne index.js) in die anderen Module kopiert. Dies hat das Problem, dass ich doppelten Code in SCM einchecke und diesen Befehl bei jeder Änderung ausführen muss. Außerdem behandelt die IDE sie nur als unterschiedliche Dateien.
quelle
Eine andere mögliche Lösung, wenn Sie git zum Verwalten Ihres Codes verwenden, ist die Verwendung von
git submodule
. Mit könnengit submodule
Sie ein weiteres Git-Repository in Ihr Projekt aufnehmen.Auf Ihren Anwendungsfall angewendet:
git submodule add <shared-git-repository-link>
Sie diese Option in Ihren Hauptprojekten, um das freigegebene Repository zu verknüpfen.Hier ist ein Link zur Dokumentation: https://git-scm.com/docs/git-submodule
quelle
Wenn ich Ihr Problem richtig verstehe, ist die Lösung komplexer als eine einzelne Antwort und hängt teilweise von Ihrer Präferenz ab.
Ansatz 1: Lokale Kopien
Sie können Gulp verwenden , um die bereits beschriebene Arbeitslösung zu automatisieren. IMO ist jedoch nicht sehr einfach zu warten und erhöht die Komplexität drastisch, wenn irgendwann ein anderer Entwickler hinzukommt.
Ansatz 2: Monorepo
Sie können ein einzelnes Repository erstellen, das alle drei Ordner enthält, und sie so verbinden, dass sie sich wie ein einzelnes Projekt verhalten. Wie oben bereits beantwortet, können Sie Lerna verwenden . Es erfordert eine gewisse Konfiguration, aber sobald dies erledigt ist, verhalten sich diese Ordner wie ein einzelnes Projekt.
Ansatz 3: Komponenten
Behandeln Sie jeden dieser Ordner als eigenständige Komponente. Schauen Sie sich Bit an . Sie können die Ordner als kleinere Teile eines größeren Projekts einrichten und ein privates Konto erstellen, das diese Komponenten nur für Sie bereitstellt. Nach der erstmaligen Einrichtung können Sie sogar Aktualisierungen auf die separaten Ordner anwenden, und der übergeordnete Ordner, der sie verwendet, erhält die Aktualisierungen automatisch.
Ansatz 4: Pakete
Sie haben ausdrücklich gesagt, dass Sie npm nicht verwenden möchten, aber ich möchte es teilen, da ich derzeit mit einem Setup wie unten beschrieben arbeite und einen perfekten Job für mich mache:
npm
oderyarn
, um ein Paket für jeden Ordner zu erstellen (Sie können Pakete mit Gültigkeitsbereich für beide erstellen, damit der Code nur dann für Sie verfügbar ist, wenn dies Ihr Anliegen ist).Funktioniert wie ein Zauber und wenn die Pakete für die lokale Entwicklung verknüpft sind, funktioniert es vollständig offline und meiner Erfahrung nach - jeder Ordner ist separat skalierbar und sehr einfach zu warten.
Hinweis
Die 'untergeordneten' Pakete sind in meinem Fall bereits vorkompiliert, da sie ziemlich groß sind und ich für jedes Paket separate tsconfigs erstellt habe, aber das Schöne ist, dass Sie es leicht ändern können. In der Vergangenheit habe ich sowohl Typoskript im Modul als auch kompilierte Dateien und auch rohe JS-Dateien verwendet, so dass das Ganze sehr, sehr vielseitig ist.
Hoffe das hilft
***** UPDATE **** Um mit Punkt 4 fortzufahren: Ich entschuldige mich, mein schlechtes. Vielleicht habe ich es falsch verstanden, weil Sie, soweit ich weiß, ein Modul nicht symlinken können, wenn es nicht hochgeladen wird. Trotzdem ist es hier:
firebase-functions
. Sie kompilieren es oder verwenden rohe ts, je nach Ihren Vorlieben.firebase-functions
als Abhängigkeit hinzufügen .tsconfig.json
, Add"paths": {"firebase-functions: ['node_modules/firebase-functions']"}
resolve: {extensions: ['ts', 'js'], alias: 'firebase-functions': }
Auf diese Weise referenzieren Sie alle aus dem
firebase-functions
Modul exportierten Funktionen einfach mitimport { Something } from 'firebase-functions'
. Webpack und TypeScript verknüpfen es mit dem Ordner der Knotenmodule. Bei dieser Konfiguration ist es dem übergeordneten Projekt egal, ob dasfirebase-functions
Modul in TypeScript oder Vanille-Javascript geschrieben ist.Einmal eingerichtet, funktioniert es perfekt für die Produktion. Dann, um zu verknüpfen und offline zu arbeiten:
firebase-functions
Projekt und schreiben Sienpm link
. Es wird ein Symlink erstellt, der lokal für Ihren Computer ist, und der Link wird dem Namen zugeordnet, den Sie in package.json festgelegt haben.npm link firebase-functions
, wodurch der Symlink erstellt und die Abhängigkeit der Firebase-Funktionen dem Ordner zugeordnet wird, in dem Sie ihn erstellt haben.quelle
Alle npm-Module werden lokal installiert und funktionieren immer offline. Wenn Sie Ihre Pakete jedoch nicht öffentlich veröffentlichen möchten, damit die Benutzer sie sehen können, können Sie die private npm-Registrierung installieren.
ProGet ist ein für Windows verfügbarer privater NuGet / Npm-Repository-Server, den Sie in Ihrer privaten Entwicklungs- / Produktionsumgebung zum Hosten, Zugreifen auf und Veröffentlichen Ihrer privaten Pakete verwenden können. Es ist zwar unter Windows, aber ich bin sicher, dass es unter Linux verschiedene Alternativen gibt.
Hier ist unser Build / Deployment-Szenario.
.npmrc
was enthältregistry=https://private-npm-repository
.bundled dependencies
das alle darin enthaltenen Pakete enthält,node_modules
und der Produktionsserver muss niemals auf NPM- oder private NPM-Pakete zugreifen, da alle erforderlichen Pakete bereits gebündelt sind.Die Verwendung eines privaten npm-Repositorys bietet verschiedene Vorteile:
quelle
Das Werkzeug, das Sie suchen, ist
npm link
.npm link
bietet Symlinks zu einem lokalen npm-Paket. Auf diese Weise können Sie ein Paket verknüpfen und in Ihrem Hauptprojekt verwenden, ohne es in der npm-Paketbibliothek zu veröffentlichen.Auf Ihren Anwendungsfall angewendet:
npm link
in Ihremshared
Paket. Dadurch wird das Symlink-Ziel für zukünftige Installationen festgelegt.functions
Paket und verwenden Sienpm link shared
, um das freigegebene Paket zu verknüpfen und es demnode_modules
Verzeichnis hinzuzufügen .Hier ist ein Link zur Dokumentation: https://docs.npmjs.com/cli/link.html
quelle