Gradleで外部ネイティブモジュールとプラグインを動的に接続する

前文



独自の「外部」ライブラリがあり、このライブラリを使用する独自のアプリケーションがあります(外部リポジトリを介してロードされます)。 ライブラリとアプリケーションの両方で変更が必要です。



ライブラリをコンパイルしてローカルのMavenリポジトリに配置してから、アプリケーションをビルドするようです。 しかし、ライブラリ内のコードをすぐに修正してアプリケーションの変更を試み、同時にIDE設定などを含むライブラリとアプリケーションコードの別々のストレージを維持したいです。



ファイルシステムにgradleリンクとシンボリックリンクを使用すると、これを簡単に配置できます。



図書館



最初に、ライブラリのbuild.gradleのコンテンツの例を示します。



import java.text.SimpleDateFormat apply plugin: 'java' apply plugin: 'maven-publish' sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 jar.baseName = 'library' publishing { publications { mavenJava(MavenPublication) { groupId='name.alenkov.habr.gradle-dynamic-dependency' version = new SimpleDateFormat('yyyyMMddHHmm').format(new Date()) from components.java } } }
      
      





ここで重要なのは、「version = new SimpleDateFormat( 'yyyyMMddHHmm')。Format(new Date())」という行です。これは、リポジトリでの公開時の現在の時刻に基づいてアセンブリのバージョンを設定します。



免責事項 :デモアプリケーションでは、製品環境でライブラリの複数のブランチをサポートしていないため、XYZビューのバージョン管理をサポートする必要はありません。



注:例では、ローカルMavenを使用しますが、Artifactoryを使用した例を提供しません。 これはアプローチに影響しません。



アプリ



それでは、アプリケーションでbuild.gradleを設定していきましょう。



build.gradleの初期状態:



 apply plugin: 'java' sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 repositories { mavenLocal() jcenter() } dependencies { compile 'name.alenkov.habr.gradle-dynamic-dependency:library:+' }
      
      









では、gradleの設定を変更して、必要なものを取得しましょう。モジュールを動的に接続します。



最初のステップは、ライブラリをextサブディレクトリのアプリケーションプロジェクトにリンクすることです。



 cd ./app/ext ln -s ../../library/ ./
      
      





2番目のステップは、小さなコードをsettings.gradleに追加することです。これにより、gradleプロジェクトの「/ ext」ディレクトリがスキャンされ、プロジェクトに接続されます。



 final extDir = new File(rootDir, 'ext') if (extDir.exists()) { extDir.eachDir { dir -> if (new File(dir, 'build.gradle').exists()) { logger.trace('found ext module: ' + dir.name) final String prjName = ':' + dir.name logger.lifecycle('include ext project: ' + prjName) include prjName project(prjName).projectDir = dir project(prjName).name = 'ext-' + dir.name } } }
      
      





3番目の最後の仕上げ-build.gradleの依存関係セクションを変更します。



 dependencies { compile findProject(':ext-library') ?: module(group: 'name.alenkov.habr.gradle-dynamic-dependency', name: 'library', version: '+') }
      
      









また、ライブラリに追加のgradleタスクがある場合の例:







Gradleプラグイン



同様に、外部のgradleプラグインを追加できます。



手順:



1. buildSrcディレクトリを作成します

2.ファイルbuildSrc / settings.gradleを作成します



 final extDir = rootDir if (extDir.exists()) { extDir.eachDir { dir -> if (new File(dir, 'build.gradle').exists()) { logger.trace('found ext plugin: ' + dir.name) final String prjName = ':' + dir.name logger.lifecycle('include ext plugin: ' + prjName) include prjName project(prjName).projectDir = dir project(prjName).name = 'ext-plugin-' + dir.name } } }
      
      





3.ファイルbuildSrc / build.gradleを作成します



 dependencies { runtime subprojects.collect { owner.project(it.path) } }
      
      





これで、 buildSrcの外部プラグインをリンクするだけで十分です。 プロジェクトでどのように選択されるかです。



 cd ./app/buildSrc ln -s ../../gradle-plugin/ ./
      
      









現在の不便さから​​-IDEAでは、動的モジュールとプラグインは正しく接続されていません- バグバグ



両方のモジュールとプラグインのソースコードは、 githubで表示できます。



UPD:同様に、gradleプラグインはbuildSrcにマウントすることによってのみ接続できます。 誰かがいる場合、私は例を書くことができます...



UPD:プラグインを使用した例を追加しました



All Articles