Сценарий
Я сделал приложение для реагирования, а также экспресс-сервер для API, и оба они разные. Я не включил папку реагирования в экспресс-приложение. Я с нетерпением жду возможности развернуть его с помощью сценариев pre/post с использованием PM2, но мне трудно достичь именно того, что у меня на уме.
Цель
На данный момент моя структура каталогов
.
├── client
├── ecosystem.config.js
└── server
Я в основном сбит с толку, так как не нашел ни одного ресурса, где это достигается. Также я не уверен, возможно ли это даже с помощью сценариев развертывания pm2, или мне нужно написать свой собственный сценарий bash, который будет делать некоторые вещи, тогда pm2 будет запускать только сервер.
Это только то, что я сделал, что кажется совершенно неправильным
экосистема.config.js
module.exports = {
apps : [{
name: 'API',
cwd: 'server',
script: 'server.js',
args: 'one two',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '1G',
env_production: {
NODE_ENV: 'production'
}
}],
deploy : {
production : {
user : 'node',
// host : '212.83.163.1',
// ref : 'origin/master',
// repo : '[email protected]:repo.git',
// path : '/var/www/production',
'post-deploy' : 'cd client && npm run build'
}
}
};
Для этого вы можете использовать средство запуска задач ( grunt или gulp). И создайте соответствующие сценарии развертывания для одного и того же и закажите их соответствующим образом.
Почему бы вам не написать сценарий bash для автоматизации установки зависимостей, получения файла сборки и последующего перемещения файлов сборки на сервер. Так у вас будет больше контроля.





Моя идея для вашей проблемы:
Вы можете комбинировать package.json как клиента, так и сервера.
Я немного запутался с вашим вопросом.
module.exports = {
apps : [{
name: 'API',
cwd: 'server',
script: 'npm run react && npm run express', //you must config npm run react && npm run express before use them
args: 'one two',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '1G',
env_production: {
NODE_ENV: 'production'
}
}],
deploy : {
production : {
user : 'node',
// host : '212.83.163.1',
// ref : 'origin/master',
// repo : '[email protected]:repo.git',
// path : '/var/www/production',
'post-deploy' : 'cd client && npm run build'
}
}
}
Скажите, если это не решит вашу проблему.
Поскольку у вас есть и сервер, и клиент вместе, я предполагаю, что он разрабатывается в монорепозитории.
Для таких целей я бы предложил использовать пряжа рабочие пространства, поскольку он сам по себе удовлетворяет вашему первому требованию (установка npm как для клиента, так и для сервера).
Чтобы включить рабочие пространства в версиях пряжи до 1.0, выполните, чтобы включить его.
yarn config set workspaces-experimental true
Затем добавьте package.json в папку (корень рабочей области) вне папок сервера и клиента вместе с любыми другими ключами package.json, которые вам нужны. Также установите общие зависимости прямо здесь, а не устанавливайте их по отдельности в обоих файлах package.json внутри сервера и клиента. (Не забудьте удалить папку node_modules внутри них, так как новая будет создана в корне рабочей области со всеми зависимостями, установленными вместе во время установки пряжи).
{
"private": true,
"workspaces": ["server", "client"]
}
Добавьте следующее в файл index.js вашего сервера.
app.use(express.static(path.join(__dirname, 'public')));
app.get('*', (req,res) =>{
res.sendFile(path.join(__dirname+'/public/index.html'));
});
И добавьте скрипт npm в корень package.json в рабочей области.
{
...
"scripts": {
"start": "yarn --cwd client react-scripts build && mv ./client/build ./server/public && node ./server/index.js"
}
...
}
Очень жаль, что мне не удалось поработать над этим, я все еще немного занят, так как у меня есть другие задачи, я просто прокомментировал это, просто люди не предполагают, что я не изучаю это. Скажу вам, если это сработает или нет :P
@IndrajeetLatthe Конечно. Не волнуйтесь.
Только один вопрос, если я буду следовать этому, я получу функции pm2? Например, что если сервер перезагрузится?
Что ж, pm2 — это менеджер приложений, поэтому вместо узла ./server/index.js вам нужно ввести pm2 start ./server/index.js в сценарии запуска последнего package.json.
Еще один вопрос: у меня также есть предприятие gitlab, возможно ли, что я тоже использую эту функцию CI? А может автоматизировать?
Да, конечно, непрерывная интеграция не зависит от того, что вы делаете в коде, кстати, просто любопытно, зачем вам CI? Запускаете какие-либо тесты или какую-либо автоматизацию, которую собираетесь делать?
Кажется, у меня мало ошибок, может быть, потому, что я запускал индекс сервера с помощью babel-node?
Я не уверена. Это звучит как совершенно новый вопрос. Кстати, другим будет полезно, если вы отметите любой из двух ответов как правильный.
mv: невозможно переместить './client/build' в './server/public/build': каталог не пустой. Я пытался удалить как сборку, так и общую папку, но я все еще получаю эту ошибку.
Хорошо, это означает, что у вас уже есть папка в пункте назначения с таким же именем, и я не хочу объединять папки. Можете попробовать cp -r ./client/build ./server/public
Это отлично работает, если мой серверный индекс не с кодом ES6, и я думаю, что должен был очистить его до того, как я использую babel-node на стороне сервера. На данный момент я решаю также создать/перенести код на стороне сервера перед запуском server. У меня тоже проблема с этим. Кажется, я должен создать еще один билет только для этого.
@IndrajeetLatthe Какую функцию ES6 вы используете, чтобы зависеть от транспиляции кода с помощью Babel?
У меня проблемы с операторами импорта, я не знаю, почему. Также я попытался установить @babel/cli и попытался сгенерировать/перенести код, но он просто выводит тот же код...
Можете ли вы добавить в свою структуру каталогов, где вы разместили package.json относительно клиента и сервера? А также опубликуйте основные моменты вашего package.json