SharedCode
(Java)モジュールと、次にAndroid
モジュールに依存するSharedCode
(Androidライブラリ)モジュールを持つプロジェクトがあります。 jar
モジュールからのSharedCode
アーティファクトと、aar
モジュールからのAndroid
アーティファクトを公開したいと思います。 artifactoryPublish
タスクの実行時に両方のモジュールがArtifactoryに公開されるように、_build.gradle
_ファイルを作成する方法がわかりません。現時点では、SharedCode
モジュールのみがそのアーティファクトをArtifactoryに公開しています。
私の_build.gradle
_ファイルは以下の通りです。 _maven-publish
_ファイルの_build.gradle
_アスペクトは正しいように見えることに注意してください。これは、publishToMavenLocal
タスクを実行すると、ローカルMavenフォルダー内の両方のモジュールからのアーティファクトが表示されるためです(つまり、_'~/.m2/repository'
_)。
まず、私のSharedCode
モジュールの_build.gradle
_ファイルは次のとおりです。
_apply plugin: 'Java'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'
group = "${projectGroupId}"
version = "${projectVersionName}"
dependencies {
compile 'com.google.guava:guava:18.0'
}
publishing {
publications {
SharedCode(MavenPublication) {
groupId "${projectGroupId}"
artifactId 'SharedCode'
version "${projectVersionName}"
from components.Java
}
}
}
artifactory {
contextUrl = "${artifactory_url}"
publish {
repository {
repoKey = 'libs-release-local'
username = "${artifactory_username}"
password = "${artifactory_password}"
}
defaults {
publications('SharedCode')
publishArtifacts = true
properties = ['qa.level': 'basic', 'dev.team': 'core']
publishPom = true
}
}
}
_
次に、Android
モジュールの_build.gradle
_ファイルは次のとおりです。
_apply plugin: 'com.Android.library'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'
group = "${projectGroupId}"
version = "${projectVersionName}"
Android {
// Android stuff here...
}
dependencies {
compile project(':SharedCode')
}
publishing {
publications {
Android(MavenPublication) {
groupId "${projectGroupId}"
artifactId 'Android'
version "${projectVersionName}"
artifact "$buildDir/outputs/aar/Android-release.aar"
}
}
}
artifactory {
contextUrl = "${artifactory_url}"
publish {
repository {
repoKey = 'libs-release-local'
username = "${artifactory_username}"
password = "${artifactory_password}"
}
defaults {
publications('Android')
publishArtifacts = true
properties = ['qa.level': 'basic', 'dev.team': 'core']
publishPom = true
}
}
}
_
ルート、プロジェクトレベル、またはartifactoryPublish
モジュールレベルでSharedCode
タスクを実行すると、次のような出力が表示されます。
_18:23:38: Executing external task 'artifactoryPublish'...
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'.
:SharedCode:generatePomFileForSharedCodePublication
:SharedCode:artifactoryPublish
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.jar
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.pom
Deploying build descriptor to: http://localhost:8081/artifactory/api/build Build successfully deployed.
Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375019604
BUILD SUCCESSFUL
_
この場合、SharedCode
アーティファクトのみが公開されることに注意してください。
artifactoryPublish
モジュールレベルでAndroid
タスクを実行すると、次のような出力が表示されます。
_18:25:25: Executing external task 'artifactoryPublish'...
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'.
:Android:artifactoryPublish
Deploying build descriptor to: http://localhost:8081/artifactory/api/build
Build successfully deployed. Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375127269
BUILD SUCCESSFUL
_
この場合、アーティファクトは公開されないことに注意してください。
Githubリポジトリのアーティファクトマルチプロジェクトの例を見ると、これまでのようにすべてのサブプロジェクトではなく、ルートプロジェクトのみに_artifactory{...}
_構成セクションが必要であるように思われます。
さらに、ルートプロジェクトでpublications('SharedCode')
を宣言すると、アーティファクトプラグインはすべてのサブプロジェクトでsharedCode
というパブリケーションを探しているようです。
私は試してみます:
Android build.gradleから_artifactory{...}
_セクションを削除します
Androidパブリケーションの名前もsharedCode
(または両方のプロジェクトでより一般的なもの)に変更します)
更新:バージョン
4.6.0
の時点で、マルチモジュールプロジェクトでアーティファクトを公開するcom.jfrog.artifactory
Gradleプラグインは機能しません。個人的な経験から、このプラグインを放棄し、標準のmaven-publish
プラグインをJavaライブラリモジュールに、digital.wup.Android-maven-publish
プラグインをAndroidライブラリモジュール。
だから私はついにこれをすべて機能させることができました!途中で私を助けてくれた@RaGeに特に感謝します。注意すべき重要な点は、artifactory
ブロックは、個々のモジュールのbuild.gradle
ファイルではなく、プロジェクトのルートレベルのbuild.gradle
ファイルにある必要があるということです。また、プロジェクトのルートレベルのartifactoryPublish.skip=true
ファイルにbuild.gradle
を追加する必要があります。完全でありながら可能な限り最小限の例については、このGitHubリポジトリを参照してください。
https://github.com/adil-hussain-84/SO-35851251-Multiproject-Artifactory-Publish
リンクが機能しなくなった場合に備えて、build.gradle
ファイルの内容もここに貼り付けます。まず、プロジェクトのルートレベルのbuild.gradle
ファイル:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.Android.tools.build:gradle:1.5.0'
classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:4.0.1'
}
}
allprojects {
apply plugin: 'com.jfrog.artifactory'
repositories {
jcenter()
}
group = "${projectGroupName}"
version = "${projectVersionName}"
}
artifactoryPublish.skip=true
artifactory {
contextUrl = "${artifactory_url}"
publish {
repository {
repoKey = 'libs-release-local'
username = "${artifactory_username}"
password = "${artifactory_password}"
}
defaults {
publications('SomePublication')
publishArtifacts = true
properties = ['qa.level': 'basic', 'dev.team': 'core']
publishPom = true
}
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.8'
}
次に、Android
モジュールのbuild.gradle
ファイル:
apply plugin: 'com.Android.library'
apply plugin: 'maven-publish'
Android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 19
targetSdkVersion 23
versionCode Integer.parseInt("${projectVersionCode}")
versionName "${projectVersionName}"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile project(':SharedCode')
compile 'com.Android.support:appcompat-v7:23.2.1'
testCompile 'junit:junit:4.12'
}
publishing {
publications {
SomePublication(MavenPublication) {
artifact "$buildDir/outputs/aar/Android-release.aar"
//The publication doesn't know about our dependencies, so we have to manually add them to the pom
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
//Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
configurations.compile.allDependencies.each {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
}
最後に、SharedCode
(Java)モジュールのbuild.gradle
ファイル:
apply plugin: 'Java'
apply plugin: 'maven-publish'
dependencies {
compile 'com.google.guava:guava:18.0'
}
publishing {
publications {
SomePublication(MavenPublication) {
from components.Java
}
}
}
それでおしまい!
Gradle Artifactoryプラグインのバージョン4.2.0が先週リリースされ、複数のArtifactoryリポジトリのデプロイが追加されました。これで、プロジェクトのモジュールごとに異なるリポジトリを使用して、アーティファクトクロージャを簡単に定義できます。