Buck:传递依赖

Buck: transitive dependencies

主项目A(APK)依赖于子项目B(AAR)。 A 和 B 都依赖于 C (AAR)。问题是 C 包含两次,导致:

"values.xml:XXX: error: Attribute "YYY" has already been defined"

如何从最终 APK 中排除瞬时依赖项 C?

项目 A:

android_binary (
  deps = [    
    ':src',
  ], ...
)

android_library(
  name = 'src',
  deps = [
  ':C',
  '//B:src',    
  '//B:res',
  ], ...
}

android_resource(
  name = 'res',
  res = 'src/main/res', ...
}

子项目B

android_aar (
  deps = [
    ':src',
    ':res'
  ], ...
)

android_library(
  name = 'src',
  deps = [
    ':res',
    ':C'
  ], ...
)

android_resource(
  name = 'res',
  deps = [
    ':C'
  ], ...
)

C 是 "appcompat-v7.aar".
注:A在"A/libs"中包含C,B在"B/libs".

中包含C

我在处理子项目 B 时最终从主项目 A 中删除了依赖项 C。
这样A通过子项目B获取C作为传递依赖,防止C被包含两次。

很难从您提供的示例中看出,但听起来您定义了两次 'C':一次在 A/libs 中,一次在 B/libs 中。因为这个 Buck 不明白它是 "the same thing"。你应该做的是将 'C' 放在 A 和 B 都可以引用它的位置(有一个 'third-party' 文件夹是 'A' 和 'B' 的对等文件夹很常见), 这样 Buck 就能看到图中有一个依赖菱形并正确解析它。