#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, ///////////////////////////////////// }