개발자
안녕하세요. 현재 리액트 네이티브로 프로젝트를 진행하고 있습니다. 막바지 단계에 거의 도달해서 이제 배포 준비를 하려고 하는데요, 마지막으로 테스트를 하기 위해 stagingRelease 로 apk 를 만들어서 테스트를 하려고 하니, .env.staging 을 읽지를 못하고 있네요. 이상한건 stagingDebug 로 할 때에는 이런 문제가 없었습니다. 지금 환경변수는 루트 디렉토리에 env 폴더가 있고, 해당 폴더 내에는 3개의 환경변수 파일이 존재합니다. .env.development .env.staging .env.production 이렇게 3개 입니다. project.ext.envConfigFiles = [ productiondebug: "env/.env.production", productionrelease: "env/.env.production", developmentrelease: "env/.env.development", developmentdebug: "env/.env.development", stagingrelease: "env/.env.staging", stagingdebug: "env/.env.staging" ] 위의 코드는 제가 설정한 환경변수 매핑하는 부분입니다. 실제로 stagingrelease 로 빌드 시에 flavor 값이 stagingrelease 로 뜨는 걸 확인했습니다. node_modules 에서 react-native-config 폴더를 찾아서 dotenv.gradle 에서 찍으니까 확인이 가능하더라고요. 제가 궁금한 점은 왜 루트에서 .env 파일만을 읽어서 BuildConfig.java 에서 사용하려고 하는걸까요? .env.staging 을 참조하지 않는 이유가 궁금합니다. 아래는 dotenv.gradle 파일입니다. import java.util.regex.Matcher import java.util.regex.Pattern def getCurrentFlavor() { Gradle gradle = getGradle() def pattern = Pattern.compile("(?:.*:)*[a-z]+([A-Z][A-Za-z0-9]+)") def flavor = "" gradle.getStartParameter().getTaskNames().any { name -> Matcher matcher = pattern.matcher(name) if (matcher.find()) { flavor = matcher.group(1).toLowerCase() return true } } println "Current flavor: $flavor" return flavor } def loadDotEnv(flavor = getCurrentFlavor()) { def envFile = project.hasProperty("defaultEnvFile") ? project.defaultEnvFile : ".env" if (System.env['ENVFILE']) { envFile = System.env['ENVFILE'] } else if (System.getProperty('ENVFILE')) { envFile = System.getProperty('ENVFILE') } else if (project.hasProperty("envConfigFiles")) { project.ext.envConfigFiles.any { pair -> if (flavor.startsWith(pair.key.toLowerCase())) { envFile = pair.value return true } } } println "Reading env from: $envFile" def env = [:] File f = new File("$project.rootDir/../$envFile"); if (!f.exists()) { f = new File("$envFile"); } if (f.exists()) { println "Found env file: $f" f.eachLine { line -> def matcher = (line =~ /^\s*(?:export\s+|)([\w\d\.\-_]+)\s*=\s*['"]?(.*?)?['"]?\s*$/) if (matcher.getCount() == 1 && matcher[0].size() == 3) { env.put(matcher[0][1], matcher[0][2].replace('"', '\\"')) // 각 환경 변수 키-값 쌍 출력 println "Loaded env variable: ${matcher[0][1]} = ${matcher[0][2]}" } } } else { println("**************************") println("*** Missing .env file ****") println("**************************") } project.ext.set("env", env) } loadDotEnv() android { defaultConfig { project.env.each { k, v -> def escaped = v.replaceAll("%","\\\\u0025") buildConfigField "String", k, "\"$v\"" resValue "string", k, "\"$escaped\"" println "Set buildConfigField and resValue: $k = $v" } } } 안드로이드 스튜디오 터미널에서 ./gradlew assembleStagingRelease 명령어를 치게 될 경우, Current flavor: stagingrelease Reading env from: .env.staging ************************** *** Missing .env file **** ************************** 이런 로그가 뜨고 있습니다.
답변 0
첫 답변을 기다리고 있어요.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 08월 20일
React Native에서 사용하는 환경변수 관련 설정이 무슨 일인지 간단히 확인해 보겠습니다. 우선 dotenv.gradle 파일의 `loadDotEnv(flavor = getCurrentFlavor())`가 실행되어, 현재 플레이버(flavor)에 해당하는 `.env` 파일을 로드합니다. 올리신 코드 상으로 봤을 때, "stagingrelease" 플레이버에 대한 env 파일은 정상적으로 ".env.staging"로 지정하셨습니다. 문제는 dotenv.gradle파일에서 파일의 위치를 찾는 부분입니다. ```java File f = new File("$project.rootDir/../$envFile"); if (!f.exists()) { f = new File("$envFile"); } ``` 위 코드를 살펴보면 처음에 프로젝트 루트 디렉토리에서 상위 경로(`../`) 바로 아래에 .env파일이 있는지 확인하고 있습니다. 그런데 만약 없으면 `$envFile`만으로 파일을 찾게 됩니다. 이러한 점 때문에 ".env.staging" 파일을 찾지 못하는 것 같네요. 사실 위 내용은 가설로, 실질적인 원인은 실제 프로젝트의 구조와 설정 등 다양한 요소들을 직접 보아야 정확하게 알 수 있습니다. 원인 파악 후 수정해볼 수 있는 방법 중 하나는 아래와 같습니다. ```java File f = new File("$project.rootDir/$envFile"); ``` 환경변수 파일의 경로를 `$project.rootDir`에서 바로 찾도록 수정해보는 것입니다. 그리고 안드로이드 스튜디오에서 clean 후 다시 빌드해보세요. 만약 해당 조치로 문제가 해결되지 않거나 다른 이슈가 생기면, 추가적인 설정 변경이 필요할 수 있습니다. 실행 환경, 프로젝트 구조 및 설정 등에 따라 이러한 문제가 발생할 수 있어 보다 상세한 분석이 필요해 보입니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!