Tujuan
Jadi saya memiliki proyek dengan struktur ini:
- aplikasi ion
- fungsi firebase
- bersama
Tujuannya adalah untuk mendefinisikan antarmuka dan kelas umum dalam shared
modul.
Batasan
Saya tidak ingin mengunggah kode saya ke npm untuk menggunakannya secara lokal dan saya tidak berencana untuk mengunggah kode sama sekali. Seharusnya 100% berfungsi offline.
Sementara proses pengembangan harus bekerja offline, ionic-app
dan firebase-functions
modul akan digunakan untuk firebase (hosting & fungsi). Oleh karena itu, kode dari shared
modul harus tersedia di sana.
Apa yang saya coba sejauh ini
- Saya telah mencoba menggunakan Referensi Proyek dalam naskah, tetapi saya belum membuatnya bekerja
- Saya mencobanya dengan menginstalnya sebagai modul npm seperti pada jawaban kedua dari pertanyaan ini
- Tampaknya bekerja dengan baik pada awalnya, tetapi selama membangun, saya mendapatkan kesalahan seperti ini ketika menjalankan
firebase deploy
:
- Tampaknya bekerja dengan baik pada awalnya, tetapi selama membangun, saya mendapatkan kesalahan seperti ini ketika menjalankan
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)
Pertanyaan
Apakah Anda memiliki solusi untuk membuat modul yang dibagikan menggunakan konfigurasi huruf, atau NPM?
Tolong jangan tandai ini sebagai duplikat → Saya telah mencoba solusi apa pun yang saya temukan di StackOverflow.
Informasi tambahan
Konfigurasi untuk dibagikan:
// 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"
}
}
Konfigurasi untuk fungsi:
// 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 saat ini
Saya telah menambahkan skrip npm ke modul bersama, yang menyalin semua file (tanpa index.js) ke modul lain. Ini memiliki masalah, bahwa saya memeriksa kode duplikat ke dalam SCM, dan bahwa saya perlu menjalankan perintah itu pada setiap perubahan. Juga, IDE hanya memperlakukannya sebagai file yang berbeda.
sumber
Solusi lain yang mungkin, jika Anda menggunakan git untuk mengelola kode Anda, adalah menggunakan
git submodule
. Menggunakangit submodule
Anda dapat memasukkan repositori git lain ke proyek Anda.Diterapkan ke kasus penggunaan Anda:
git submodule add <shared-git-repository-link>
di dalam proyek utama Anda untuk menautkan repositori bersama.Berikut ini tautan ke dokumentasi: https://git-scm.com/docs/git-submodule
sumber
Jika saya memahami masalah Anda dengan benar, solusinya lebih kompleks daripada satu jawaban dan sebagian tergantung pada preferensi Anda.
Pendekatan 1: Salinan lokal
Anda dapat menggunakan Gulp untuk mengotomatiskan solusi kerja yang telah Anda jelaskan, tetapi IMO itu tidak mudah untuk mempertahankan dan secara drastis meningkatkan kompleksitas jika pada suatu titik pengembang lain masuk.
Pendekatan 2: Monorepo
Anda dapat membuat repositori tunggal yang berisi ketiga folder dan menghubungkannya sehingga berperilaku sebagai satu proyek. Seperti yang sudah dijawab di atas, Anda dapat menggunakan Lerna . Ini memerlukan sedikit konfigurasi, tetapi setelah selesai, folder-folder itu akan berperilaku sebagai satu proyek.
Pendekatan 3: Komponen
Perlakukan masing-masing folder ini sebagai komponen yang berdiri sendiri. Lihatlah Bit . Ini akan memungkinkan Anda untuk mengatur folder sebagai bagian yang lebih kecil dari proyek yang lebih besar dan Anda dapat membuat akun pribadi yang akan lingkup komponen hanya untuk Anda. Setelah awalnya diatur, itu akan memungkinkan Anda untuk bahkan menerapkan pembaruan ke folder yang terpisah dan orang tua yang menggunakannya akan secara otomatis mendapatkan pembaruan.
Pendekatan 4: Paket
Anda secara khusus mengatakan bahwa Anda tidak ingin menggunakan npm, tetapi saya ingin membagikannya, karena saya saat ini bekerja dengan pengaturan seperti yang dijelaskan di bawah ini dan sedang melakukan pekerjaan yang sempurna untuk saya:
npm
atauyarn
untuk membuat paket untuk setiap folder (Anda dapat membuat paket scoped untuk keduanya sehingga kode hanya akan tersedia untuk Anda, jika ini menjadi perhatian Anda).Bekerja seperti pesona dan ketika paket di-symlink untuk pengembangan lokal, ia bekerja sepenuhnya offline dan menurut pengalaman saya - setiap folder dapat diskalakan secara terpisah dan sangat mudah untuk dipelihara.
Catatan
Paket 'child' sudah dikompilasi dalam kasus saya karena mereka cukup besar dan saya telah membuat tsconfigs terpisah untuk setiap paket, tetapi hal yang indah adalah Anda dapat mengubahnya dengan mudah. Di masa lalu saya berdua menggunakan naskah dalam modul dan file yang dikompilasi, dan juga file js mentah, sehingga semuanya sangat, sangat fleksibel.
Semoga ini membantu
***** UPDATE **** Untuk melanjutkan pada poin 4: Saya minta maaf, saya salah. Mungkin saya salah karena sejauh yang saya tahu, Anda tidak dapat menyinkronkan modul jika tidak diunggah. Namun demikian, ini dia:
firebase-functions
untuk itu. Anda mengkompilasinya, atau menggunakan ts mentah, tergantung pada preferensi Anda.firebase-functions
sebagai ketergantungan.tsconfig.json
, tambahkan"paths": {"firebase-functions: ['node_modules/firebase-functions']"}
resolve: {extensions: ['ts', 'js'], alias: 'firebase-functions': }
Dengan cara ini, Anda merujuk semua fungsi yang diekspor dari
firebase-functions
modul hanya dengan menggunakanimport { Something } from 'firebase-functions'
. Webpack dan TypeScript akan menautkannya ke folder modul simpul. Dengan konfigurasi ini, proyek induk tidak akan peduli jikafirebase-functions
modul ditulis dalam TypeScript atau vanilla javascript.Setelah diatur, ini akan bekerja dengan sempurna untuk produksi. Lalu, untuk menautkan dan bekerja offline:
firebase-functions
proyek dan tulisnpm link
. Ini akan membuat symlink, lokal ke mesin Anda dan akan memetakan tautan nama yang Anda atur di package.json.npm link firebase-functions
, yang akan membuat symlink dan memetakan ketergantungan fungsi-fungsi firebase ke folder di mana Anda telah membuatnya.sumber
Semua modul npm diinstal secara lokal dan selalu bekerja offline, tetapi jika Anda tidak ingin mempublikasikan paket Anda secara publik sehingga orang dapat melihatnya, Anda dapat menginstal registry npm pribadi.
ProGet adalah server repositori NuGet / Npm Private yang tersedia untuk windows yang dapat Anda gunakan dalam pengembangan pribadi / lingkungan produksi Anda untuk menjadi tuan rumah, mengakses dan mempublikasikan paket pribadi Anda. Meskipun ada di windows tapi saya yakin ada berbagai alternatif yang tersedia di linux.
Berikut ini adalah skenario build / deployment kami.
.npmrc
yang berisiregistry=https://private-npm-repository
.bundled dependencies
yang berisi semua paket di dalamnyanode_modules
dan server produksi tidak perlu mengakses paket NPM atau NPM pribadi karena semua paket yang diperlukan sudah dibundel.Menggunakan repositori npm pribadi memiliki berbagai keuntungan,
sumber
Alat yang Anda cari adalah
npm link
.npm link
menyediakan symlink ke paket npm lokal. Dengan begitu Anda dapat menautkan sebuah paket dan menggunakannya dalam proyek utama Anda tanpa menerbitkannya ke pustaka paket npm.Diterapkan ke kasus penggunaan Anda:
npm link
di dalamshared
paket Anda . Ini akan menetapkan tujuan symlink untuk pemasangan di masa mendatang.functions
paket Anda dan gunakannpm link shared
untuk menautkan paket bersama dan menambahkannya kenode_modules
direktori.Berikut ini tautan ke dokumentasi: https://docs.npmjs.com/cli/link.html
sumber