コンパイルパッケージ編—BuiildConfigを活用する

4219 ワード

第一に、どのようにBulildConfigファイルで独自の属性を構築するかを確認します.第二に、これらのカスタム属性をコマンドラインでどのように修正し、異なるバージョンのインストールパッケージを構築しますか?(例えば、正式な環境にログログをつけて印刷するカバンなど)
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に対応する変数の値を指定し、動的に配置を変更する効果があります.