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 就能看到图中有一个依赖菱形并正确解析它。
主项目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".
我在处理子项目 B 时最终从主项目 A 中删除了依赖项 C。
这样A通过子项目B获取C作为传递依赖,防止C被包含两次。
很难从您提供的示例中看出,但听起来您定义了两次 'C':一次在 A/libs 中,一次在 B/libs 中。因为这个 Buck 不明白它是 "the same thing"。你应该做的是将 'C' 放在 A 和 B 都可以引用它的位置(有一个 'third-party' 文件夹是 'A' 和 'B' 的对等文件夹很常见), 这样 Buck 就能看到图中有一个依赖菱形并正确解析它。