React Native — .ENV не определены в файле конфигурации Metro Bundler при объединении приложений iOS

#ios #reactjs #react-native #environment-variables #metro-bundler

Вопрос:

У меня есть сценарии NPM, которые создают и запускают наше приложение с помощью поддельных внутренних данных (используемых для тестирования компонентов). Они устанавливают ENV встроенно, используя пакет npm cross-env.

"android-mock": "cross-env MOCK_BACKEND=1 NODE_ENV=development node generate-config.js amp;amp; react-native run-android -- --reset-cache", — эмулятор работает в Windows

"ios-mock": "cross-env MOCK_BACKEND=1 NODE_ENV=development node generate-config.js amp;amp; react-native run-ios -- --reset-cache", — симулятор работает на macOS


Metro bundler ищет MOCK_BACKEND env и на основе этого определяет пути, чтобы приложение использовало поддельные данные вместо того, чтобы полагаться на серверную часть для их получения.

Проблема: Metro может считывать process.env.MOCK_BACKEND значение только при комплектации приложений для Android, в iOS значение возвращается неопределенным.


Как правильно определить ENV, чтобы Metro мог правильно их читать и для комплектации iOS?

Ответ №1:

Я не знаю почему, но похоже, что Metro перезаписывает установленные параметры при комплектации приложений iOS. В других местах определены ENV.

Если кто-нибудь столкнется с этой проблемой, вот как я ее решил.

Решение

1. В generate-config.js скрипте, который находится в скриптах NPM выше, я добавил проверки NODE_ENV. Сценарий генерирует config.js внутреннюю общую папку на основе NODE_ENV.

 const fs = require("fs"); console.log( process.env.NODE_ENV);  if(process.env.NODE_ENV === 'production'){  fs.copyFile("config.runtime.js","public/config.js",(err) =gt; {if(!err){console.log(err)}}); } else if (process.env.NODE_ENV === 'mock'){  fs.copyFile("config.mock.js","public/config.js",(err) =gt; {if(!err){console.log(err)}}); } else {  fs.copyFile("config.debug.js","public/config.js",(err) =gt;{if(!err){console.log(err)}}); }  

2. Я импортировал сгенерированный config.js файл в Metro.config и использовал его по мере необходимости.

const config = require(path.resolve(__dirname, 'public/config.js'));

config.js для справки:

 module.exports = {  isProduction : false,  disableCache: true,  API:"http://alanj.bs.local:15455/",  /////////////////////////////////////  // ENVs  /////////////////////////////////////  MOCKED_BACKEND: 1,  ///////////////////////////////////// }