문자열 유형으로 buildConfigField를 생성하는 방법
내 안에서Android Studio
프로젝트는 두 개입니다.build configuration
일부와 함께buildConfigField
:
buildTypes {
def SERVER_URL = "SERVER_URL"
def APP_VERSION = "APP_VERSION"
debug {
buildConfigField "String", SERVER_URL, "http://dev.myserver.com"
buildConfigField "String", APP_VERSION, "0.0.1"
}
release {
buildConfigField "String", SERVER_URL, "https://myserver.com"
buildConfigField "String", APP_VERSION, "0.0.1"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
다음과 같은 오류가 발생합니다.
/path/to/generated/BuildConfig.java
Error:(14, 47) error: ';' expected
Error:(15, 47) error: ';' expected
생성된 사람들BuildConfig.java
는 다음과 같습니다.
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.mycuteoffice.mcoapp";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Fields from build type: debug
public static final String APP_VERSION = 0.0.1;
public static final String SERVER_URL = http://dev.mycuteoffice.com;
}
제 생각엔APP_VERSION
그리고.SERVER_URL
문자열 유형이므로 따옴표가 없습니다.
나는 그것이 왜 그렇게 생성되는지 잘 모르겠습니다.어떻게 하면 이 문제를 해결할 수 있는지 알려주시기 바랍니다.
문자열 유형 빌드 구성 필드는 다음과 같이 선언해야 합니다.
buildConfigField "String", "SERVER_URL", "\"http://dev.myserver.com\""
따옴표로 묶은 필드 이름, 이스케이프 따옴표로 묶은 필드 값을 추가합니다.
왜 모두가 이중 따옴표를 피하는 것에 그렇게 화가 났습니까?못생겼어요!여러분, 여기는 그루비입니다. 인용구 하나와 인용구 두 개를 섞으면 됩니다.
buildConfigField "String", 'SERVER_URL', '"http://dev.myserver.com"'
buildConfigField "String", 'APP_VERSION', '"0.0.1"'
"문제 해결"이 리터럴을 이중으로 인용할 필요가 없다는 뜻이라면, 디자인대로 작동하는 것처럼 보이기 때문에 저는 아무것도 보지 못했습니다.
저는 해결책으로 리터럴을 "gradle.properties"로 이동하여 잠재적으로 여러 개의 추한 선을 하나의 추한 선으로 바꾸는 실험을 해왔습니다.
이와 같은 경우:
buildTypes {
def SERVER_URL = "SERVER_URL"
def APP_VERSION = "APP_VERSION"
def CONFIG = { k -> "\"${project.properties.get(k)}\"" }
debug {
buildConfigField "String", SERVER_URL, CONFIG("debug.server.url")
buildConfigField "String", APP_VERSION, CONFIG("version")
}
release {
buildConfigField "String", SERVER_URL, CONFIG("release.server.url")
buildConfigField "String", APP_VERSION, CONFIG("version")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Gradle.속성
version=0.1.1
...
debug.server.url=http://dev.myserver.com
...
release.server.url=http://myserver.com
...
추가 의견:
def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" }
def CONFIG_DEBUG = { k -> CONFIG('debug',k) }
def CONFIG_RELEASE = { k -> CONFIG('release',k) }
def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" }
def CONFIG_INT = { b,k -> "${project.properties.get(b+'.'+k)}" }
...
사용하다
buildConfigField "String", "FILE_NAME", "\"{$fileName}\""
가변의여기서 참조
문자열 따옴표를 이스케이프합니다.
buildConfigField "String", 'SERVER_URL', "\"http://dev.myserver.com\""
buildConfigField "String", 'APP_VERSION', "\"0.0.1\""
저도 헷갈렸어요.그러나 "문자열"은 필드의 유형을 정의하는 반면 필드 값은 자동으로 따옴표로 묶이지 않으므로 식을 사용할 수 있습니다.
buildConfigField "String", "TEST", "new Integer(10).toString()"
그렇지 않으면, 그것은 불가능할 것입니다.
우리는 Gradle 속성 또는 다른 곳에서 정의된 Gradle 상수를 피해야 합니다.
buildConfigField "String", "CONSTANT_NAME", "\"${CONSTANT_VALUE}\""
어디에CONSTANT_VALUE
본 문서에 정의되어 있습니다.gradle.properties
아니면 다른 곳에서:
CONSTANT_VALUE=string_goes_here
환경에서 상수를 얻을 때도 마찬가지로 적용됩니다.
buildConfigField "String", "CONSTANT_NAME", "\"${System.getenv('PATH')}\""
가장 많이 투표된 솔루션은 문자열을 수동으로 추가하기만 하면 되는 경우에 효과적이며, 이 솔루션은 한 단계 더 나아가게 됩니다.
- 코드 쓰기
gradle.properties
YOUR_ACCESS_PARAMS = "YOUR_VALUE"
- 앱 레벨에 코드 쓰기
build.gradle
android{
...
buildTypes.each{
it.buildConfigField 'String', 'ACCESS_PARAMS', YOUR_ACCESS_PARAMS
}
}
- 생성된 BuildConfig.java는 다음과 같습니다.
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "xxx.xxxxxxxx.xxx";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0.0";
// Fields from build type: debug
public static final String ACCESS_PARAMS = "YOUR_VALUE";
}
buildConfigField 및 manifestPaceholder 변수가 필요합니다.이 문제를 해결하기 위해 나는 합니다.
def appAuthScheme= "appauth.myscheme"
buildConfigField 'String', 'APP_AUTH_SCHEME',"\"$appAuthScheme\""
manifestPlaceholders = [lowerApplicationId : applicationId.toLowerCase(),
appAuthRedirectScheme : appAuthScheme]
구성 빌드.APP_AUTH_SCHEM은 문자열입니다!
앱 빌드에서.gradle.
def buildTimeAndVersion = releaseTime() + "-" + getSvnVersion()
buildTypes {
debug {
signingConfig signingConfigs.config
buildConfigField "String", 'BIULD_TIME', "\"${buildTimeAndVersion}\""
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
...
}
static def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getDefault())
}
def getSvnVersion() {
def pro = ("svnversion -c " + getBuildDir().parent).execute()
pro.waitFor()
def version = pro.in.text
Pattern p = Pattern.compile("(\\d+\\:)?(\\d+)\\D?")
Matcher m = p.matcher(version)
if (m.find()) {
version = m.group(m.groupCount())
}
try {
return version
} catch (e) {
println e.getMessage()
}
return 0
}
그런 다음 BuildConfig에서
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "xxx.xxxxxxxx.xxx";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 53;
public static final String VERSION_NAME = "5.4.4";
// Fields from build type: debug
public static final String BIULD_TIME = "20181030-2595";
}
니드 해브def variable
debug {
...
def myVersion = '1.0.0'
buildConfigField 'String', 'TEST', "\"${myVersion}\""
}
저는 그 값들 중 일부가 문자열이라는 것을 강조하고 싶었습니다.동시에 저는 가독성을 이유로 탈출한 인용문을 별로 좋아하지 않았습니다.
다소 순진해 보일 수도 있지만, 결국 저는 이 대안을 선택했습니다.
buildConfigField "String", "LIB_VERSION_NAME", '"' + "${versionName}" + '"'
결과는 다음과 같습니다.
언급URL : https://stackoverflow.com/questions/30796533/how-to-generate-buildconfigfield-with-string-type
'source' 카테고리의 다른 글
기본값 롤백 방법 Git (0) | 2023.08.20 |
---|---|
Swift에서 술어 사용 (0) | 2023.08.20 |
PyCharm, PHPStorm 또는 RubyMine과 같은 IntelliJ IDEA IDE에서 Powershell을 터미널로 사용 (0) | 2023.08.20 |
div에 오버플로 요소가 있는지 jquery로 확인합니다. (0) | 2023.08.20 |
각도 6에서 ng add와 npm 설치의 차이 (0) | 2023.08.20 |