Babel / Core-JS не находит собственные файлы - AWS EB Django - PullRequest
0 голосов
/ 22 октября 2019

Мне трудно заставить ReactJS и все его зависимости работать должным образом в среде AWS Elastic Beanstalk. В настоящее время я пытаюсь заставить Вавилон работать. Кажется, он не знает, куда он установил себя - в какую папку он входит. Например, вы должны иметь возможность использовать "@babel/preset-env" для предустановленного имени, но я обнаружил, что мне нужно указать полный путь,"/opt/elasticbeanstalk/eb_infra/node_modules/@babel/preset-env", иначе он не сможет его найти. (Аналогично с другими пресетами / плагинами.)

Я получил большинство вещей в рабочем состоянии, используя этот подход, за исключением core-js. Кажется, он ищет в / tmp / свои модули. Странно, но я смог добавить символическую ссылку оттуда к ее фактическому местоположению. Но сейчас он не может найти core-js/modules/es.string.split. Я посмотрел в папку реальных модулей и, конечно же, этот файл не существует.

Итак, мой вопрос: что это за файл es.string.split (кроме очевидного - какой-нибудь полифилл для String.split), почему он не ищет, например, es6.string.split (который также не существует)), почему он отсутствует и т. д. и т. д. Как мне заставить это работать.

Я получаю сообщение об ошибке:

[Application update [...]/Command 02_compress] : Activity execution failed, because: CommandError: An error occurred during rendering [...my_template].html: Error: Cannot find module 'core-js/modules/es.string.split' from '/tmp'
  at /usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:46:17
  at process (/usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:173:43)
  at ondir (/usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:188:17)
  at load (/usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:69:43)
  at onex (/usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:92:31)
  at /usr/lib/node_modules/browserify/node_modules/browser-resolve/node_modules/resolve/lib/async.js:22:47
  at FSReqWrap.oncomplete (fs.js:153:21)

Установочный файл .ebextensions:

# approach taken from https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/instance-configuration/install-nodejs.config

files:
  "/tmp/prep_node_installation.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #! /bin/bash
      curl --silent --location https://rpm.nodesource.com/setup_10.x | bash -

  "/tmp/install_node.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #! /bin/bash
      yum -y install nodejs

  "/tmp/install_npm.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #! /bin/bash
      curl --silent --location http://npmjs.org/install.sh | sh

  "/tmp/install_babel.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #! /bin/bash
      npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-react @babel/plugin-proposal-class-properties
      npm install --save core-js@3 @babel/polyfill
      npm install -g browserify

      # For some reason, core-js seems to be looking in /tmp/ for its files. So place a symbolic link from there to the actual folder that has the files.
      ln -sf /opt/elasticbeanstalk/eb_infra/node_modules/@babel/polyfill/node_modules/core-js /tmp/core-js


commands:
  05_prep_for_node_install:
    command: "sh /tmp/prep_node_installation.sh"
    ignoreErrors: false

  10_install_node:
    command: "sh /tmp/install_node.sh"
    ignoreErrors: false

  20_install_npm:
    command: "sh /tmp/install_npm.sh"
    ignoreErrors: false

  30_install_babel:
    command: "sh /tmp/install_babel.sh"
    ignoreErrors: false

Файл Babel config.js:

const presets = [
  [
    // Because "@babel/preset-env" doesn't work...
    "/opt/elasticbeanstalk/eb_infra/node_modules/@babel/preset-env",
    {
      targets: {
        edge: "17",
        firefox: "60",
        chrome: "67",
        safari: "11.1",
        ie: "11",
      },
      useBuiltIns: "usage",
      corejs: 3,
    },
  ],
  [
    "/opt/elasticbeanstalk/eb_infra/node_modules/@babel/preset-react",
    {}
  ],
];

const plugins = [
  "/opt/elasticbeanstalk/eb_infra/node_modules/@babel/plugin-proposal-class-properties",
];

module.exports = { presets, plugins };

Мое приложение уже настроено на использование Django-Compressor, поэтому эта команда запускает Babel для подготовки к сжатию из settings.py:

_babel_executable = os.environ.get(
    'BABEL_EXECUTABLE',
    # Full path because it can't find the `babel` executable either
    '/opt/elasticbeanstalk/eb_infra/node_modules/.bin/babel'
)
COMPRESS_PRECOMPILERS = [
    ('text/javascript',
     ('cat {infile} | %s -f {infile} > {outfile}.tmp;' % _babel_executable) +
     'browserify {outfile}.tmp -o {outfile}'),

    ('text/jsx',
     ('cat {infile} | %s -f {infile} > {outfile}.tmp;' % _babel_executable) +
     'browserify {outfile}.tmp -o {outfile}'),
]

1 Ответ

0 голосов
/ 01 ноября 2019

npm ПРЕДУПРЕЖДЕНИЕ saveError ENOENT: такого файла или каталога нет, откройте '/opt/elasticbeanstalk/eb_infra/package.json'

из официального потока AWS [1], оно появляется (и это была моя проблема) что вы можете архивировать каталог верхнего уровня, а не сам исходный код.

Например, у вас могут быть все ваши файлы в папке с именем "Project". Вместо того, чтобы архивировать «Проект», вы должны сжать и загрузить содержимое «Проекта».

[1] https://forums.aws.amazon.com/thread.jspa?messageID=476022

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...