Я использую реактивную систему для создания кроссплатформенного приложения, но я не знаю, как установить переменную среды, чтобы у меня были разные константы для разных сред.
Пример:
development:
BASE_URL: '',
API_KEY: '',
staging:
BASE_URL: '',
API_KEY: '',
production:
BASE_URL: '',
API_KEY: '',
react-native
Дэймон Юань
источник
источник
import {Platform} from 'react-native';
console.log(Platform);
Ответы:
Вместо того, чтобы жестко программировать константы вашего приложения и переключать среду (я сейчас объясню, как это сделать), я предлагаю использовать двенадцать факторов, чтобы ваш процесс сборки определял вас
BASE_URL
и вашAPI_KEY
.Чтобы ответить, как представить свою среду
react-native
, я предлагаю использовать babel-plugin-transform-inline-environment-variable .Чтобы это работало, вам нужно скачать плагин, а затем вам нужно будет настроить a,
.babelrc
и он должен выглядеть примерно так:И поэтому, если вы переносите свой реактивный код с помощью запуска
API_KEY=my-app-id react-native bundle
(или start, run-ios или run-android), то все, что вам нужно сделать, это сделать ваш код следующим образом:И тогда Бабель заменит это на:
Надеюсь это поможет!
источник
process.env
этоNODE_ENV
.process.env.API_KEY
... используйтеprocess.env['API_KEY']
вместо этогоreact-native start --reset-cache
каждый раз, когда вы меняете переменные среды.Самое простое (не самое лучшее или идеальное ) решение, которое я нашел, состояло в том, чтобы использовать response-native-dotenv . Вы просто добавляете предустановку «response-native-dotenv» в свой
.babelrc
файл в корне проекта следующим образом:Создайте
.env
файл и добавьте свойства:Тогда в вашем проекте (JS):
источник
base_url
для обоихstaging
иproduction
?.env
файлов (для каждой среды) или о повторном использовании некоторых ваших значений в разных.env
файлах, чтобы не дублировать их, скажем, в Staging и Production?.env
файлах для каждой среды, скажем,staging
иproduction
.На мой взгляд, лучший вариант - это использовать response-native-config . Поддерживает 12 факторов .
Я нашел этот пакет чрезвычайно полезным. Вы можете установить несколько сред, например, разработка, подготовка, производство.
В случае Android переменные доступны также в классах Java, gradle, AndroidManifest.xml и т. Д. В случае iOS переменные доступны также в классах Obj-C, Info.plist.
Вы просто создаете файлы, как
.env.development
.env.staging
.env.production
Вы заполняете эти файлы ключом, такими значениями
а затем просто используйте его:
Если вы хотите использовать разные среды, вы в основном устанавливаете переменную ENVFILE следующим образом:
или для сборки приложения для производства (андроид в моем случае):
источник
React native не имеет понятия глобальных переменных. Он строго соблюдает модульную область видимости , чтобы способствовать модульности и повторному использованию компонентов.
Однако иногда вам нужны компоненты, чтобы быть в курсе их среды. В этом случае очень просто определить
Environment
модуль, который компоненты могут затем вызывать для получения переменных среды, например:environment.js
мой-component.js
Это создает одноэлементную среду, к которой можно получить доступ из любого места в пределах области вашего приложения. Вы должны явно указать
require(...)
модуль из любых компонентов, которые используют переменные окружения, но это хорошо.источник
getPlatform()
. Я сделал файл, как это, но не могу закончить логику здесь, в React Nativestaging
илиproduction
даже значить, потому что это зависит от вашего окружения. Например, если вы хотите использовать разные варианты для IOS против Android, вы можете инициализировать Environment, импортировав егоindex.ios.js
иindex.android.js
файлы и установив там платформу, напримерEnvironment.initialize('android')
.env.js
файл, обязательно пропустите его при регистрации в хранилище и скопируйте используемые ключи с пустыми строковыми значениями в другойenv.js.example
файл, который вы регистрируете, чтобы другие могли легче создавать ваше приложение. Если вы случайно отметили секреты проекта, попробуйте переписать историю, чтобы удалить их не только из источника, но и из истории.Я использовал
__DEV__
полифилл, встроенный в реагирующий натив, чтобы решить эту проблему. Он автоматически устанавливается доtrue
тех пор, пока вы не создаете реагирующую версию для производства.Например:
Тогда как раз
import {url} from '../vars'
и вы всегда получите правильный. К сожалению, это не будет работать, если вам нужно более двух сред, но это просто и не требует добавления дополнительных зависимостей в ваш проект.источник
Конкретный метод, используемый для установки переменных среды, зависит от службы CI, подхода к сборке, платформы и инструментов, которые вы используете.
Если вы используете Buddybuild for CI для создания приложения и управления переменными среды , и вам нужен доступ к конфигурации из JS, создайте
env.js.example
ключи с ключами (с пустыми строковыми значениями) для регистрации в системе контроля версий и используйте Buddybuild для созданияenv.js
файл во время сборки наpost-clone
шаге, скрывая содержимое файла из журналов сборки, вот так:Подсказка: не забудьте добавить
env.js
в.gitignore
конфигурацию, чтобы секреты не попадали в систему контроля версий случайно во время разработки.Вы можете управлять , как файл будет написана с использованием переменных Buddybuild , как
BUDDYBUILD_VARIANTS
, например, чтобы получить больший контроль над тем, как ваш конфиг производится во время сборки.источник
env.js.example
часть? скажем, я хочу запустить приложение в моей локальной среде. если мойenv.js
файл находится в gitignore иenv.js.example
используется в качестве структуры, тоenv.js.example
это недопустимое расширение JS, поэтому я просто немного запутался в том, что вы имели в виду под этой частьюenv.js.example
Файл находится в кодовой базе как справочный документ, канонический источник правды относительно того, какие ключи конфигурации приложение хочет использовать. Он описывает ключи, необходимые для запуска приложения, а также имя файла, ожидаемое после копирования и переименования. Шаблон является обычным явлением в приложениях Ruby, использующих драгоценный камень dotenv , из которого я и взял этот шаблон.Я думаю, что-то вроде следующей библиотеки может помочь вам решить недостающую часть головоломки, функцию getPlatform ().
https://github.com/joeferraro/react-native-env
Единственная проблема, которую я вижу с этим, что это асинхронный код. Существует запрос на получение поддержки getSync. Проверьте это тоже.
https://github.com/joeferraro/react-native-env/pull/9
источник
я создал сценарий предварительной сборки для той же проблемы, потому что мне нужны разные конечные точки API для разных сред
И я создал обычай
npm run scripts
для запуска реакции на родную ..Мой пакет-json
Затем в моих службах компоненты просто импортировать автоматически сгенерированный файл:
источник
Шаг 1: Создайте отдельный компонент, такой как имя компонента: pagebase.js
Шаг 2: Внутри этого кода использования
Шаг 3: Используйте его в любом компоненте, для использования сначала импортируйте этот компонент, а затем используйте его. Импортируйте это и используйте это:
источник
Я использую
babel-plugin-transform-inline-environment-variables
.Что я сделал, так это поместил файлы конфигурации в S3 с моими различными средами.
КАЖДЫЙ env файл:
После этого я добавил новый скрипт,
package.json
который запускает скрипт для комплектацииВ вашем приложении вы, вероятно, будете иметь файл конфигурации, который имеет:
который будет заменен на babel:
ПОМНИТЕ, что вы должны использовать
process.env['STRING']
НЕ,process.env.STRING
иначе он не будет преобразован должным образом.источник
REMEMBER you have to use process.env['STRING'] NOT process.env.STRING or it won't convert properly.
Спасибо! Это тот, кто меня сбивает с толку !!![Источник] Из того, что я обнаружил, похоже, что по умолчанию можно выполнять только конфигурации для производства и разработки (без промежуточной или другой среды) - это правильно?
Прямо сейчас я использую файл environment.js, который можно использовать для обнаружения каналов выпуска expo и изменения возвращаемых переменных на основании этого, но для сборки мне нужно обновить не- DEV переменную, возвращаемую в качестве промежуточной или промежуточной. прод:
альтернативы
У кого-нибудь есть опыт использования response-native-dotenv для проектов, построенных с помощью expo? Я хотел бы услышать ваши мысли
https://github.com/zetachang/react-native-dotenv
источник
у вас также могут быть разные сценарии env: production.env.sh development.env.sh production.env.sh
А затем отправьте их в начало, когда начнете работать [который просто привязан к псевдониму], так что все, что имеет файл sh, это экспорт для каждой переменной env:
И затем добавление babel-plugin-transform-inline-environment-variable позволит получить к ним доступ в коде:
источник
Ответ @ chapinkapa хорош. Подход, который я выбрал с тех пор, как Mobile Center не поддерживает переменные среды, заключается в предоставлении конфигурации сборки через собственный модуль:
На андроиде:
или на ios:
Вы можете прочитать конфигурацию сборки синхронно и решить в Javascript, как вы будете себя вести.
источник
Можно получить доступ к переменным с помощью
process.env.blabla
вместоprocess.env['blabla']
. Я недавно заставил это работать и прокомментировал, как я сделал это по проблеме на GitHub, потому что у меня были некоторые проблемы с кешем на основе принятого ответа. Здесь проблема.источник
Для последних версий RN вы можете использовать этот собственный модуль: https://github.com/luggit/react-native-config
источник