コンパイルパッケージ編—BuiildConfigを活用する
4219 ワード
第一に、どのようにBulildConfigファイルで独自の属性を構築するかを確認します.第二に、これらのカスタム属性をコマンドラインでどのように修正し、異なるバージョンのインストールパッケージを構築しますか?(例えば、正式な環境にログログをつけて印刷するカバンなど)
1起因
最近会社のプロジェクトを見て、下記のコードを見ました.
2 react-native-configの使用説明
そこで
まず簡単にその使い方を紹介します.まずプロジェクトのルートディレクトリで一つのファイルを定義することを
3なぜBuiildConfig.javaファイルに現れましたか?
次に、
buildconfig.png
これは成功してまた私の好奇心を呼び起こして、どうして
これはこのRNライブラリのAndroidエンドコードが何をしているかを見なければならないので、ソースコードを探しに行きます.これはAndroidプロジェクトの
1システム環境変数の中に環境変数
4まとめ
最初のステップは、スクリプトファイルを作成し、カスタム環境変数(例えば第一に、環境変数によって指定されたファイルが見つかりました. 第二に、ファイル中のすべてのフィールドを巡回し、 第二のステップは、
第三ステップ、コンパイル包装;
この場合、releaseパッケージを作成しても、exportコマンドでBultiConfigに対応する変数の値を指定し、動的に配置を変更する効果があります.
1起因
最近会社のプロジェクトを見て、下記のコードを見ました.
import Config from 'react-native-config';
const developConfig = {
api: {
protocol: 'http',
host: 'test-api.anystories.app',
},
};
const releaseConfig = {
api: {
protocol: 'https',
host: "api.anybooks.live",
},
};
let config = releaseConfig;
// , ,
if (Config.ENV === "dev" || __DEV__) {
config = developConfig;
}
export {
config,
};
上の行にマークされているコードに注意してください.このconfig.ENVのENVはどうやって来ますか?2 react-native-configの使用説明
そこで
react-native-config
の使い方を知りました.公式サイトのアドレスは以下の通りです.まず簡単にその使い方を紹介します.まずプロジェクトのルートディレクトリで一つのファイルを定義することを
.dev
といいます.そしてファイルの中でいくつかの変数を勝手に定義します.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'
この時、ENVは実は.dev
ファイルで定義されている変数です.実はこれはRNとAndroidのインタラクションに露出された定数値です.後で紹介する機会があります.3なぜBuiildConfig.javaファイルに現れましたか?
次に、
.dev
ファイルで定義されている変数は、Androidでプロジェクトをコンパイルするときに生成されるBuildConfig.java
ファイルに直接現れます.buildconfig.png
これは成功してまた私の好奇心を呼び起こして、どうして
.dev
ファイルの中の変数はBuildConfig.java
ファイルの中で現れますか?これはこのRNライブラリのAndroidエンドコードが何をしているかを見なければならないので、ソースコードを探しに行きます.これはAndroidプロジェクトの
build.gradle
構築シナリオから話さなければなりません.react-native-config
ライブラリを使用した後、build.gradle
に次の行のコードが導入されます.apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"
ここは直接dotenv.gradle
脚本を導入して、dotensv.gradleファイルを見つけました.中には次のようなシナリオがあります.def loadDotEnv(flavor = getCurrentFlavor()) {
def envFile = ".env"
if (System.env['ENVFILE']) {
envFile = System.env['ENVFILE']
println("zp_test system env")
} else if (System.getProperty('ENVFILE')) {
envFile = System.getProperty('ENVFILE')
println("zp_test system getProperty")
} else if (project.hasProperty("envConfigFiles")) {
// use startsWith because sometimes the task is "generateDebugSources", so we want to match "debug"
project.ext.envConfigFiles.any { pair ->
if (flavor.startsWith(pair.key)) {
envFile = pair.value
return true
}
}
} else if (project.hasProperty("defaultEnvFile")) {
envFile = project.defaultEnvFile
}
...
}
loadDotEnv()
android {
defaultConfig {
project.env.each { k, v ->
def escaped = v.replaceAll("%","\\\\u0025")
buildConfigField "String", k, "\"$v\""
resValue "string", k, "\"$escaped\""
}
}
}
以上のスクリプトファイルは一つ一つ説明しません.大体のロジックは以下の通りです.1システム環境変数の中に環境変数
ENVFILE
という名前の変数を探しに行きます.存在すれば、直接環境変数に値を付けます.2存在しない場合は、システムの属性に存在するかどうかを確認します.3存在しない場合は、項目のdefaultEnvFile
属性を確認する.4このファイルを見つけて巡回してBuildConfig
に書き込みます.buildconfig
に書き込まれたコード:buildConfigField "String", k, "\"$v\""
3つのパラメータは、書き込みのフィールドタイプ、書き込みのフィールド名、書き込みのフィールド値となります.環境変数を指定します.ここにはコマンドラインがあります.export xxx=.dev
.環境変数xxxが指定されている場合、コンパイルされたxxx環境変数は.dev
を指します.上記のコードのENVFILE
.4まとめ
最初のステップは、スクリプトファイルを作成し、カスタム環境変数(例えば
ENVFILE
)を取得します.スクリプトファイルは主に2つの役割があります.buildConfigField "String", k, "\"$v\""
というコードを利用して、ファイル中の値をBuildConfigに書き込む.export
コマンドで、ENVFILE
のような現在のexport ENVFILE=.env
がどのファイルであるかを指定する.第三ステップ、コンパイル包装;
この場合、releaseパッケージを作成しても、exportコマンドでBultiConfigに対応する変数の値を指定し、動的に配置を変更する効果があります.