[react-native] 반응 네이티브에서 환경 변수를 설정합니까?

크로스 플랫폼 앱을 만들기 위해 react-native를 사용하고 있지만 환경에 따라 다른 상수를 가질 수 있도록 환경 변수를 설정하는 방법을 모릅니다.

예:

development:
  BASE_URL: '',
  API_KEY: '',
staging:
  BASE_URL: '',
  API_KEY: '',
production:
  BASE_URL: '',
  API_KEY: '',



답변

대신 앱 상수를 하드 코딩 및 환경에 스위치를하는, 내가 사용하는 것이 좋습니다 (나는 순간에 그 작업을 수행하는 방법을 설명 할 것이다) 열두 요소의 빌드 프로세스를 갖는 제안을 당신의 정의 BASE_URL와를 API_KEY.

환경을 노출시키는 방법에 대답하려면 react-nativeBabel의 babel-plugin-transform-inline-environment-variables를 사용하는 것이 좋습니다 .

이 작업을 수행하려면 플러그인을 다운로드 한 다음 a를 설정 .babelrc해야하며 다음과 같이 표시되어야합니다.

{
  "presets": ["react-native"],
  "plugins": [
    "transform-inline-environment-variables"
  ]
}

따라서 실행 API_KEY=my-app-id react-native bundle(또는 start, run-ios 또는 run-android)을 실행 하여 반응 네이티브 코드를 변환 하면 코드를 다음과 같이하면됩니다.

const apiKey = process.env['API_KEY'];

그리고 바벨은 이것을 다음으로 대체 할 것입니다.

const apiKey = 'my-app-id';

도움이 되었기를 바랍니다!


답변

내가 찾은 가장 간단한 ( 최상의 또는 이상적이지 않은 ) 솔루션은 react-native-dotenv 를 사용하는 입니다. “react-native-dotenv”사전 설정을 .babelrc프로젝트 루트 의 파일에 다음과 같이 추가하면됩니다.

{
  "presets": ["react-native", "react-native-dotenv"]
}

.env파일을 작성하고 특성을 추가하십시오.

echo "SOMETHING=anything" > .env

그런 다음 프로젝트 (JS)에서 :

import { SOMETHING } from 'react-native-dotenv'
console.log(SOMETHING) // "anything"


답변

제 생각에는 가장 좋은 옵션은 react-native-config 사용하는 것 입니다. 그것은 12 팩터를 지원합니다 .

이 패키지가 매우 유용하다는 것을 알았습니다. 개발, 스테이징, 프로덕션 등 여러 환경을 설정할 수 있습니다.

Android의 경우 변수는 Java 클래스, gradle, AndroidManifest.xml 등에서도 사용할 수 있습니다. iOS의 경우 변수는 Obj-C 클래스 인 Info.plist에서도 사용할 수 있습니다.

당신은 같은 파일을 만들

  • .env.development
  • .env.staging
  • .env.production

이러한 파일을 키와 같은 값으로 채 웁니다.

API_URL=https://myapi.com
GOOGLE_MAPS_API_KEY=abcdefgh

그런 다음 사용하십시오.

import Config from 'react-native-config'

Config.API_URL  // 'https://myapi.com'
Config.GOOGLE_MAPS_API_KEY  // 'abcdefgh'

다른 환경을 사용하려면 기본적으로 다음과 같이 ENVFILE 변수를 설정하십시오.

ENVFILE=.env.staging react-native run-android

또는 프로덕션 용 앱 조립 (내 경우에는 안드로이드) :

cd android && ENVFILE=.env.production ./gradlew assembleRelease


답변

반응 네이티브에는 전역 변수라는 개념이 없습니다. 컴포넌트 모듈 성과 재사용 성을 높이기 위해 모듈 식 범위를 엄격하게 적용 합니다.

그러나 때로는 환경을 인식하기 위해 구성 요소가 필요합니다. 이 경우 Environment구성 요소가 환경 변수를 얻기 위해 호출 할 수 있는 모듈 을 정의하는 것은 매우 간단합니다 . 예를 들면 다음과 같습니다.

environment.js

var _Environments = {
    production:  {BASE_URL: '', API_KEY: ''},
    staging:     {BASE_URL: '', API_KEY: ''},
    development: {BASE_URL: '', API_KEY: ''},
}

function getEnvironment() {
    // Insert logic here to get the current platform (e.g. staging, production, etc)
    var platform = getPlatform()

    // ...now return the correct environment
    return _Environments[platform]
}

var Environment = getEnvironment()
module.exports = Environment

my-component.js

var Environment = require('./environment.js')

...somewhere in your code...
var url = Environment.BASE_URL

이렇게하면 앱 범위 내 어디에서나 액세스 할 수 있는 싱글 톤 환경 이 만들어집니다 . require(...)환경 변수를 사용하는 모든 구성 요소에서 모듈 을 명시 적으로 지정 해야하지만 좋은 것입니다.


답변

__DEV__이 문제를 해결하기 위해 반응 네이티브에 내장 된 폴리 필을 사용했습니다 . true프로덕션 용 기본 반응을 작성하지 않는 한 자동으로 설정됩니다 .

예 :

//vars.js

let url, publicKey;
if (__DEV__) {
  url = ...
  publicKey = ...
} else {
  url = ...
  publicKey = ...
}

export {url, publicKey}

그런 다음 import {url} from '../vars'항상 올바른 것을 얻을 수 있습니다. 불행히도, 둘 이상의 환경을 원할 경우 작동하지 않지만 쉽고 간단하며 프로젝트에 더 많은 종속성을 추가하지 않습니다.


답변

환경 변수를 설정하는 데 사용되는 특정 방법은 사용중인 CI 서비스, 빌드 방식, 플랫폼 및 도구에 따라 다릅니다.

CI 용 Buddybuild를 사용하여 앱을 빌드 하고 환경 변수를 관리 하고 JS에서 구성에 액세스해야하는 경우 env.js.example소스 제어에 체크인하기위한 키 (빈 문자열 값 포함)를 작성하고 Buddybuild를 사용하여 단계 env.js에서 빌드 시간에 post-clone파일을 작성하여 빌드 로그에서 파일 내용을 숨기십시오.

#!/usr/bin/env bash

ENVJS_FILE="$BUDDYBUILD_WORKSPACE/env.js"

# Echo what's happening to the build logs
echo Creating environment config file

# Create `env.js` file in project root
touch $ENVJS_FILE

# Write environment config to file, hiding from build logs
tee $ENVJS_FILE > /dev/null <<EOF
module.exports = {
  AUTH0_CLIENT_ID: '$AUTH0_CLIENT_ID',
  AUTH0_DOMAIN: '$AUTH0_DOMAIN'
}
EOF

팁 : 개발 과정에서 실수로 구성 및 비밀이 소스 제어에 체크인되지 않도록 추가 env.js하는 것을 잊지 마십시오 .gitignore.

그런 다음와 같은 Buddybuild 변수를 사용하여 파일을 작성하는 방법을 관리하여 BUDDYBUILD_VARIANTS빌드시 구성이 생성되는 방식을보다 효과적으로 제어 할 수 있습니다.


답변

나는 다음과 같은 라이브러리가 퍼즐의 누락 된 비트 인 getPlatform () 함수를 해결하는 데 도움이 될 수 있다고 생각합니다.

https://github.com/joeferraro/react-native-env

const EnvironmentManager = require('react-native-env');

// read an environment variable from React Native
EnvironmentManager.get('SOME_VARIABLE')
  .then(val => {
    console.log('value of SOME_VARIABLE is: ', val);

  })
  .catch(err => {
    console.error('womp womp: ', err.message);
  });

내가 볼 수있는 유일한 문제는 비동기 코드라는 것입니다. getSync를 지원하기위한 풀 요청이 있습니다. 그것도 확인하십시오.

https://github.com/joeferraro/react-native-env/pull/9