Цель
Итак, у меня есть проект с этой структурой:
- ионно-приложение
- firebase-функции
- общий
Цель состоит в том, чтобы определить общие интерфейсы и классы в shared
модуле.
ограничения
Я не хочу загружать свой код в npm, чтобы использовать его локально, и вообще не планирую загружать код. Он должен на 100% работать в автономном режиме.
Хотя процесс развития должен работать в автономном режиме, ionic-app
и firebase-functions
модули будут развернуты firebase (хостинг и функция). Поэтому код из shared
модуля должен быть доступен там.
Что я пробовал до сих пор
- Я пытался использовать Проект Ссылки в машинописном тексте, но не приблизился к работе
- Я пытался установить его как модуль 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)
Вопрос
Есть ли у вас решение для создания общего модуля, используя либо конфигурацию сценариев, либо 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"
}
}
Текущее мнение
Я добавил скрипт npm в общий модуль, который копирует все файлы (без index.js) в другие модули. Проблема в том, что я проверяю дублирующий код в SCM, и мне нужно запускать эту команду при каждом изменении. Кроме того, IDE просто обрабатывает его как разные файлы.
источник
Другое возможное решение, если вы используете git для управления вашим кодом, это использование
git submodule
. С помощьюgit submodule
вы можете включить в свой проект другой репозиторий git.Применяется к вашему варианту использования:
git submodule add <shared-git-repository-link>
внутри вашего основного проекта (ов), чтобы связать общий репозиторий.Вот ссылка на документацию: https://git-scm.com/docs/git-submodule
источник
Если я правильно понимаю вашу проблему, решение является более сложным, чем один ответ, и оно частично зависит от ваших предпочтений.
Подход 1: Локальные копии
Вы можете использовать Gulp для автоматизации уже описанного вами рабочего решения, но IMO не очень прост в обслуживании и значительно увеличивает сложность, если в какой-то момент заходит другой разработчик.
Подход 2: Монорепо
Вы можете создать один репозиторий, содержащий все три папки, и соединить их так, чтобы они вели себя как один проект. Как уже ответили выше, вы можете использовать Lerna . Это требует некоторой настройки, но после этого эти папки будут работать как один проект.
Подход 3: Компоненты
Рассматривайте каждую из этих папок как отдельный компонент. Посмотрите на Бит . Это позволит вам настроить папки как меньшие части большого проекта, и вы сможете создать личную учетную запись, которая будет охватывать эти компоненты только для вас. После первоначальной настройки это позволит вам даже применять обновления к отдельным папкам, а родительская, которая их использует, автоматически получит обновления.
Подход 4: пакеты
Вы специально сказали, что не хотите использовать npm, но я хочу поделиться им, потому что в настоящее время я работаю с настройкой, как описано ниже, и отлично справляюсь со мной:
npm
илиyarn
чтобы создать пакет для каждой папки (вы можете создать пакеты с областью действия для них обоих, чтобы код был доступен только вам, если это вас интересует).Работает как чудо, и когда пакеты являются символическими ссылками для локальной разработки, они работают полностью автономно, и, по моему опыту, каждая папка масштабируется отдельно и очень проста в обслуживании.
Запись
В моем случае «дочерние» пакеты уже предварительно скомпилированы, так как они довольно большие, и я создал отдельные tsconfigs для каждого пакета, но прекрасно то, что вы можете легко его изменить. В прошлом я использовал как машинный текст в модуле, так и скомпилированные файлы, а также необработанные js-файлы, так что все это очень и очень универсально.
Надеюсь это поможет
***** ОБНОВЛЕНИЕ **** Для продолжения по пункту 4: я прошу прощения, мой плохой. Может быть, я ошибся, потому что, насколько я знаю, вы не можете символическую ссылку на модуль, если он не загружен. Тем не менее, вот оно:
firebase-functions
для этого . Вы компилируете его или используете raw ts, в зависимости от ваших предпочтений.firebase-functions
в качестве зависимости.tsconfig.json
, добавить"paths": {"firebase-functions: ['node_modules/firebase-functions']"}
resolve: {extensions: ['ts', 'js'], alias: 'firebase-functions': }
Таким образом, вы ссылаетесь на все свои экспортируемые функции из
firebase-functions
модуля просто с помощьюimport { Something } from 'firebase-functions'
. Webpack и TypeScript свяжут его с папкой модулей узла. При такой конфигурации родительский проект не будет заботиться оfirebase-functions
том, написан модуль на TypeScript или ванильном javascript.После настройки он отлично подойдет для производства. Затем, чтобы связать и работать в автономном режиме:
firebase-functions
проекту и написатьnpm link
. Он создаст символическую ссылку, локальную для вашего компьютера, и отобразит ссылку, имя которой вы указали в package.json.npm link firebase-functions
, что создаст символическую ссылку и отобразит зависимость firebase-функций от папки, в которой вы ее создали.источник
Все модули npm устанавливаются локально и всегда работают в автономном режиме, но если вы не хотите публиковать свои пакеты публично, чтобы люди могли их видеть, вы можете установить частный реестр npm.
ProGet - это сервер частного репозитория NuGet / Npm, доступный для окон, который вы можете использовать в своей частной среде разработки / производства для размещения, доступа и публикации ваших личных пакетов. Хотя это на окнах, но я уверен, что есть разные альтернативы, доступные на Linux.
Вот наш сценарий сборки / развертывания.
.npmrc
чтоregistry=https://private-npm-repository
.bundled dependencies
котором содержатся все пакеты внутри,node_modules
и производственному серверу никогда не требуется доступ к NPM или частным пакетам NPM, поскольку все необходимые пакеты уже связаны.Использование частного репозитория npm имеет различные преимущества,
источник
Инструмент, который вы ищете, это
npm link
.npm link
предоставляет символические ссылки на локальный пакет npm. Таким образом, вы можете связать пакет и использовать его в своем основном проекте, не публикуя его в библиотеке пакетов npm.Применяется к вашему варианту использования:
npm link
внутри вашейshared
упаковки. Это установит назначение символической ссылки для будущих установок.functions
пакета и используйте,npm link shared
чтобы связать общий пакет и добавить его вnode_modules
каталог.Вот ссылка на документацию: https://docs.npmjs.com/cli/link.html
источник