13

プロジェクト レイアウトが既に指定されている状況で、Gradle マルチプロジェクト ビルドを作成しようとしています。私はこのようなものを持っています:

-->Shared\
---->SharedComponent1\
------>build.gradle
------>src\
...
---->SharedComponent2\
------>build.gradle
...
-->Product1\
---->ProductComponent1\
------>build.gradle
---->ProductComponent2\
------>build.gradle
...
---->build\
------>settings.gradle

私のsettings.gradleは次のようになります:

rootProject.name = 'Product1'
rootProject.projectDir = new File( "${ProjectsRoot}" )

include 'Shared:SharedComponent1'
include 'Shared:SharedComponent2'
include 'Product1:ProductComponent1'
include 'Product1:ProductComponent2'

次のようにビルドフォルダーでGradleを実行すると:

gradle -PProjectsRoot=c:\my\project\root\dir projects

私は得る:

:projects

------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'build'
No sub-projects

To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :tasks

BUILD SUCCESSFUL

つまり、ビルドしようとしているプロジェクトが見つかりません。私がやろうとしていることは、Gradle のマルチプロジェクト サポートで可能ですか? それとも、間違った木を吠えていますか?

4

2 に答える 2

32

いくつかの指針:

  • Gradleは、論理プロジェクト階層(Gradleがビルドをプロジェクトの論理階層に編成する方法)を物理ディレクトリレイアウトから厳密に分離します。ほぼすべてのマッピングが可能です。(頭に浮かぶ1つの例外は、2つのプロジェクトが同じプロジェクトディレクトリを共有することはできないということです。)
  • カスタムディレクトリレイアウトを実装するにはprojectDir、ルートプロジェクトだけでなく、すべてのプロジェクトに設定する必要があります。となどの相対パスを使用する必要がrootProject.projectDir = new File(settingsDir, "../foo")ありproject(":sub1").projectDir = new File(rootDir, "bar")ます。ここで、settingsDirは、を含むディレクトリを指しsettings.gradlerootDirはの省略形ですrootProject.projectDir
  • プロジェクトを一般的に構成するために、再帰的に歩くことができます(root)Project.children。プロジェクトを表すために異なるタイプを使用することsettings.gradleに注意してください-それぞれProjectDescriptorProjectbuild.gradle
  • settings.gradleGradleは、を含むディレクトリまたはそのサブディレクトリから呼び出す必要があります。したがって、使いやすさの観点から、settings.gradleディレクトリ階層のルートに配置するのが最適です。

詳細については、「Gradleビルド言語リファレンスの設定」および「Gradleユーザーガイド」の「マルチプロジェクトビルド」の章を参照してください。

于 2013-02-06T13:21:51.470 に答える
11

完全settings.gradleを期すために、上記の私の特定の例を解決したのは次のとおりです。

rootProject.name = 'Product1'

def projectTreeRootDir = new File( "${ProjectsRoot}" )

// Shared components

def sharedRootDir = new File( projectTreeRootDir, 'Shared' )

include ':SharedComponent1'
project( ':SharedComponent1' ).projectDir = new File( sharedRootDir, 'SharedComponent1' )

include ':SharedComponent2'
project( ':SharedComponent2' ).projectDir = new File( sharedRootDir, 'SharedComponent2' )

// Product components

includeFlat 'ProductComponent1', 'ProductComponent2'

明らかに、これは多数のサブプロジェクトには対応できず、上記の Peter によって提供されたヒントを使用すると、大幅に改善される可能性があります。

于 2013-02-06T21:56:36.943 に答える