2015-01-31 3 views
1

최종 목표는 다른 버전으로 이적 종속성 버전을 대체하는 것입니다. 주의해야 할 점은 교체가 라이브러리가 건설되고 의존 사람들에 의해 선택해야한다는 것입니다 (이것은 표준 Gradle을 또는 플러그인의 경우 나도 몰라하지만 우리 exclude 이적 의존성 경우, 생성 ivy.xml 파일은 해당 정보가됩니다). 최종 목표를 달성하기 위해Gradle에서 어떻게 프로그래밍 방식으로 제외하고 종속성을 강제합니까?

한 가지 가능한 방법은 다음 문제의 의존성을 exclude 나중에 그 의존성을 강제하는 것입니다.

의존성 같은 함께 exclude하는 방법

:

dependencies { 
    compile 'org:name:version' { 
     exclude(group: 'group', module: 'module') 
    } 
} 

force 의존하는 방법이 추천 무언가이다 두 함께 묶어 위해

configurations.all { 
    resolutionStrategy { 
     eachDependency { DependencyResolveDetails dependencyResolveDetails -> 
      final requestedDependency = dependencyResolveDetails.requested 
      if (requestedDependency.group == 'org' && requestedDependency.name == 'name') { 
       force 'group:module:good_version' 
      } 
     } 
    } 
} 

상기 resolutionStrategy 어떤 종속성이 실제로 exclude d인지 알고 있어야하며 나중에 종속성은 force d가됩니다. 어떻게 이것을 일반적인 방법으로 할 수 있습니까? (exclude을 수행하는 일반적인 방법이 있다고 가정합니다)? 둘을 묶는 방법이 없다면 최종 목표를 달성하는 다른 방법이 있습니까?

+0

{ '프로젝트를 다른 라이브러리를'} \ n 컴파일 '다른 라이브러리를 : 프로젝트 : XYZ'그룹을 제외 –

+0

를 라이브러리 프로젝트 내부에 전이가있는 경우 당신은 즉 로거 라이브러리 사용을 제공, 부모 프로젝트에 가져와야 컴파일하는 대신에. 그러면 부모 프로젝트에서 나중에 컴파일해야하는 라이브러리의 가상 버전이 생깁니다. –

+0

MLProgrammer-CIM @, 그것은 멀티 모듈 프로젝트이기 때문에 나는 프로그래밍을하고 싶은 나는 DRY 일을 계속하고 싶다. –

답변

0

첫째, 추상적 인 종속성이 그래서 그들은 같은 모양 :

dependencies { 
    compile dep('org:name') 
} 

dep 기능은 다음 자동 제외 처리됩니다 방법으로 정의 할 수 있습니다 : 마지막으로

final rev = [ 
    'group:module': 'good_version' 
    'org:name': 'version'] 

ext.rev = { m -> 
    rev[m] 
} 

final dep = { m -> 
    "${m}:${ext.rev(m)}" 
} 

final forcedTransitiveDeps = [ 
     'org:name': [ 
      dep('group:module')]].withDefault({[]}) 

ext.forcedTransitiveDeps = { m -> 
    forcedTransitiveDeps[m] 
} 

ext.dep = { m -> 
    if (!forcedTransitiveDeps.containsKey(m)) { 
     project.dependencies.create(dep(m)) 
    } else { 
     project.configure(
       project.dependencies.create(dep(m)), 
       { 
        forcedTransitiveDeps[m].each { dependency -> 
         final dependencyParts = dependency.split(':') 
         exclude(group: dependencyParts[0], module: dependencyParts[1]) 
        } 
       }) 
    } 
} 

, 종속성을 다시 소개하고 강제 적용 :

subprojects { subproject -> 
    subproject.afterEvaluate { 
     subproject.configurations.all { Configuration configuration -> 
      final dependencies = configuration.getDependencies() 
      final forcedDependencies = (dependencies.collect { dependency -> 
       forcedTransitiveDeps("${dependency.group}:${dependency.name}") 
      }).flatten() 
      if (!forcedDependencies.isEmpty()) { 
       logger.info("Forcing ${subproject} dependencies on ${forcedDependencies} as per `ext.forcedTransitiveDeps`.") 
       dependencies.addAll(forcedDependencies.collect { forcedDependency -> 
        subproject.dependencies.create(forcedDependency) 
       }) 
      } 
     } 
    } 
} 
관련 문제