巴克:传递依赖

时间:2016-05-03 19:00:54

标签: android build multi-project transitive-dependency buck

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

  

“values.xml:XXX:错误:属性”YYY“已经定义为”

如何从最终的APK中排除瞬态依赖关系?

项目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.

2 个答案:

答案 0 :(得分:0)

当我在子项目B上工作时,我最终从主项目A中删除了依赖关系C. 这样,A通过子项目B获得C作为传递依赖,并防止C被包括两次。

答案 1 :(得分:0)

从您提供的示例中很难说,但听起来您已经定义了两次“C”:一次在A / libs中,一次在B / libs中。因此,巴克并不理解它是“同一件事”。你应该做的是把'C'放在一个A和B都可以引用它的位置(有一个'第三方'文件夹,它是'A'和'B'的对等点很常见),这样Buck会能够看到图中存在依赖项菱形并正确解析。