Реагировать на экспресс-развертывание pm2

Сценарий

Я сделал приложение для реагирования, а также экспресс-сервер для API, и оба они разные. Я не включил папку реагирования в экспресс-приложение. Я с нетерпением жду возможности развернуть его с помощью сценариев pre/post с использованием PM2, но мне трудно достичь именно того, что у меня на уме.

Цель

  1. Я хочу запустить npm install как для клиента, так и для сервера, так как я могу удалить/добавить пакет, если это потребуется позже.
  2. Я думаю, что после установки npm я хочу создать приложение для реагирования, а затем переместить эту папку для обслуживания в экспресс (я не знаю, возможно ли указать путь к каталогу, который находится вне родительского для экспресс-статического содержимого).
  3. Затем я хочу запустить экспресс-сервер, который в конечном итоге будет обслуживать файлы сборки реакции.

На данный момент моя структура каталогов

.
├── 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'
    }
  }
};

Можете ли вы добавить в свою структуру каталогов, где вы разместили package.json относительно клиента и сервера? А также опубликуйте основные моменты вашего package.json

arjnt 12.06.2019 12:48

Для этого вы можете использовать средство запуска задач ( grunt или gulp). И создайте соответствующие сценарии развертывания для одного и того же и закажите их соответствующим образом.

Abhishek Singh 13.06.2019 13:34

Почему бы вам не написать сценарий bash для автоматизации установки зависимостей, получения файла сборки и последующего перемещения файлов сборки на сервер. Так у вас будет больше контроля.

Muljayan 14.06.2019 10:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
9
3
2 400
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Моя идея для вашей проблемы:

  1. Вы можете комбинировать package.json как клиента, так и сервера.

  2. Я немного запутался с вашим вопросом.

  3. Вы можете настроить как:
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

Indrajeet Latthe 13.06.2019 10:11

@IndrajeetLatthe Конечно. Не волнуйтесь.

PrivateOmega 13.06.2019 10:18

Только один вопрос, если я буду следовать этому, я получу функции pm2? Например, что если сервер перезагрузится?

Indrajeet Latthe 14.06.2019 19:56

Что ж, pm2 — это менеджер приложений, поэтому вместо узла ./server/index.js вам нужно ввести pm2 start ./server/index.js в сценарии запуска последнего package.json.

PrivateOmega 14.06.2019 20:05

Еще один вопрос: у меня также есть предприятие gitlab, возможно ли, что я тоже использую эту функцию CI? А может автоматизировать?

Indrajeet Latthe 14.06.2019 20:18

Да, конечно, непрерывная интеграция не зависит от того, что вы делаете в коде, кстати, просто любопытно, зачем вам CI? Запускаете какие-либо тесты или какую-либо автоматизацию, которую собираетесь делать?

PrivateOmega 14.06.2019 20:20

Кажется, у меня мало ошибок, может быть, потому, что я запускал индекс сервера с помощью babel-node?

Indrajeet Latthe 14.06.2019 20:28

Я не уверена. Это звучит как совершенно новый вопрос. Кстати, другим будет полезно, если вы отметите любой из двух ответов как правильный.

PrivateOmega 14.06.2019 20:29

mv: невозможно переместить './client/build' в './server/public/build': каталог не пустой. Я пытался удалить как сборку, так и общую папку, но я все еще получаю эту ошибку.

Indrajeet Latthe 14.06.2019 20:53

Хорошо, это означает, что у вас уже есть папка в пункте назначения с таким же именем, и я не хочу объединять папки. Можете попробовать cp -r ./client/build ./server/public

PrivateOmega 14.06.2019 20:57

Это отлично работает, если мой серверный индекс не с кодом ES6, и я думаю, что должен был очистить его до того, как я использую babel-node на стороне сервера. На данный момент я решаю также создать/перенести код на стороне сервера перед запуском server. У меня тоже проблема с этим. Кажется, я должен создать еще один билет только для этого.

Indrajeet Latthe 17.06.2019 12:57

@IndrajeetLatthe Какую функцию ES6 вы используете, чтобы зависеть от транспиляции кода с помощью Babel?

PrivateOmega 17.06.2019 12:59

У меня проблемы с операторами импорта, я не знаю, почему. Также я попытался установить @babel/cli и попытался сгенерировать/перенести код, но он просто выводит тот же код...

Indrajeet Latthe 17.06.2019 14:01

Другие вопросы по теме