Gradle 구현 대 API 구성
나는 무엇이 다른지 알아내려고 노력하고 있습니다.api
그리고.implementation
종속성을 구축하는 동안 구성할 수 있습니다.
문서에는 다음과 같이 나와 있습니다.implementation
빌드 시간이 더 낫지만, 비슷한 질문에서 이 댓글을 보니 그게 사실인지 의문이 듭니다.
제가 그라들 전문가가 아니기 때문에, 누군가 도와줄 수 있기를 바랍니다.저는 이미 설명서를 읽었는데 이해하기 쉬운 설명이 궁금합니다.
그compile
키워드는 다음을 위해 더 이상 사용되지 않습니다.api
그리고.implementation
종속성을 구성하는 키워드입니다.
용사를 합니다.api
더 이상 사용되지 않는 것을 사용하는 것과 같습니다.compile
그래서 만약 당신이 모든 것을 대체한다면.compile
와 함께api
모든 것이 언제나처럼 작동할 것입니다.
이해기위해를 implementation
키워드는 다음 예를 고려합니다.
예
라고 불리는 도서관이 있다고 가정해 보겠습니다.MyLibrary
으로 내적으다라사를용다니합리라고 불리는 다른 합니다.InternalLibrary
이와 같은 것:
// 'InternalLibrary' module
public class InternalLibrary {
public static String giveMeAString(){
return "hello";
}
}
// 'MyLibrary' module
public class MyLibrary {
public String myString(){
return InternalLibrary.giveMeAString();
}
}
를 들어어▁the들▁suppose를MyLibrary
build.gradle
사용하다api
을 참조하십시오.dependencies{}
다음과 같이:
dependencies {
api(project(":InternalLibrary"))
}
당신은 항목할을 .MyLibrary
.build.gradle
다음 종속성을 추가합니다.
dependencies {
implementation(project(":MyLibrary"))
}
api
권장되지 않음)compile
)에 액세스할 수 있습니다.InternalLibrary
응용 프로그램 코드:
// Access 'MyLibrary' (granted)
MyLibrary myLib = new MyLibrary();
System.out.println(myLib.myString());
// Can ALSO access the internal library too (but you shouldn't)
System.out.println(InternalLibrary.giveMeAString());
으로 모듈을 합니다.MyLibrary
잠재적으로 무언가의 내부 구현을 "실행"합니다.사용자가 직접 가져온 것이 아니므로 사용할 수 없습니다.
그implementation
이를 방지하기 위해 구성이 도입되었습니다.는 그서이당이신제를 하면,implementation
에 api
MyLibrary
:
dependencies {
implementation(project(":InternalLibrary"))
}
당신은 전화를 할 수 없을 것입니다.InternalLibrary.giveMeAString()
더 이상 당신의 앱 코드에서.
을 통해 은 러한종복플전통해이 Android Gradle 러당다있알니에서 하면 알 수.InternalLibrary
다음의 재컴파일만 트리거해야 합니다.MyLibrary
액세스 권한이 없기 때문에 전체 앱의 재컴파일이 아닙니다.InternalLibrary
.
중첩된 종속성이 많은 경우 이 메커니즘은 빌드 속도를 크게 높일 수 있습니다. (이를 완전히 이해하려면 마지막에 링크된 비디오를 참조하십시오.)
결론들
때, 은 당신의 Android Gradle 3.X를 .X로 전환할 때, 당신은 당신의 모든 것을 교체해야 합니다.
compile
implementation
키워드 *(1). 그런 다음 앱을 컴파일하고 테스트해 보십시오. 문제가 없는 경우 코드를 그대로 유지하고, 문제가 있는 경우 종속성에 문제가 있거나 액세스가 더 용이하지 않은 개인 정보를 사용했을 수 있습니다. * Android Gradle 플러그인 엔지니어 제롬 도체스의 제안 (1)이 도서관 이라면, 은 만약합당도관당면사니다용야해신은라이리를 사용해야 합니다.
api
API를 사용할 수 .implementation
최종 사용자가 사용해서는 안 되는 시험 종속성 또는 종속성.
구현과 api의 차이점을 소개하는 유용한 기사
참조(시간 절약을 위해 분할된 동일한 비디오)
Google I/O 2017 - Gradle 빌드 속도 향상 방법(풀 비디오)
Google I/O 2017 - Gradle 빌드 속도 향상(새로운 GRADLE PLINGIN 3.0.0 부품만 해당)
Google I/O 2017 - Gradle 빌드 속도 향상 방법(1* 참조)
나는 생각하는 것을 좋아합니다.api
(다른 모듈에 의해 보이는) 공공으로서의 의존성.implementation
종속성을 비공개로 지정합니다(이 모듈에서만 확인됨).
참고로, 그것과는 다릅니다.public
/private
와 방법, 변수와 방법,api
/implementation
종속성은 런타임에 의해 적용되지 않습니다.은 단지 최적화일 뿐이며, 를 통해 이은단빌뿐이며, 이통해를이 가능합니다.Gradle
종속성 중 하나가 API를 변경할 때 어떤 모듈을 다시 컴파일해야 하는지 확인합니다.
당신이 가지고 있다고 생각합니다.app
를 사용하는 lib1
도서관으로서 그리고lib1
사용하다lib2
도관으로서 과 같은 이와같것은:app -> lib1 -> lib2
.
이제사때할을 할 때.api lib2
lib1
,그리고나서app
수 있음 lib2
때 :api lib1
또는implementation lib1
에 시대에app
모듈.
나사 시용러를 할 때implementation lib2
lib1
,그리고나서app
을 볼 수 없습니다.lib2
암호를
링크를 참조하십시오: Android Studio Developers 공식 사이트에서 이용할 수 있습니다.
종속성 블록 내에서 여러 종속성 구성(예: 위의 구현) 중 하나를 사용하여 라이브러리 종속성을 선언할 수 있습니다.각 종속성 구성은 Gradle에 종속성 사용 방법에 대한 다양한 지침을 제공합니다.
실행
Gradle은 컴파일 클래스 경로에 종속성을 추가하고 빌드 출력에 종속성을 패키지화합니다.그러나 모듈이 구현 종속성을 구성하면 컴파일 시 종속성이 다른 모듈로 유출되지 않도록 Gradle이 알립니다.즉, 다른 모듈은 런타임에만 종속성을 사용할 수 있습니다.api 또는 컴파일(사용되지 않음) 대신 이 종속성 구성을 사용하면 빌드 시스템에서 다시 컴파일해야 하는 모듈 수가 줄어들기 때문에 빌드 시간이 크게 향상될 수 있습니다.예를 들어, 구현 종속성이 API를 변경하면 Gradle은 해당 종속성과 직접 종속된 모듈만 다시 컴파일합니다.대부분의 앱 및 테스트 모듈은 이 구성을 사용해야 합니다.
API
Gradle은 컴파일 클래스 경로 및 빌드 출력에 종속성을 추가합니다.모듈에 api 종속성이 포함되면 Gradle은 모듈이 종속성을 다른 모듈로 과도적으로 내보내 런타임과 컴파일 시간에 모두 사용할 수 있음을 알립니다.이 구성은 컴파일(현재는 더 이상 사용되지 않음)과 마찬가지로 작동하지만 다른 업스트림 소비자에게 과도하게 내보내야 하는 종속성에만 주의하여 사용해야 합니다.api 종속성이 외부 API를 변경하면 Gradle은 컴파일 시 해당 종속성에 액세스할 수 있는 모든 모듈을 다시 컴파일하기 때문입니다.따라서 많은 수의 api 의존성을 갖는 것은 빌드 시간을 크게 증가시킬 수 있습니다.종속성의 API를 별도의 모듈에 노출하려는 경우를 제외하고 라이브러리 모듈은 대신 구현 종속성을 사용해야 합니다.
그라들 설명서에서:
JVM 기반 프로젝트를 위한 매우 간단한 빌드 스크립트를 살펴보겠습니다.
plugins {
id 'java-library'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.hibernate:hibernate-core:3.6.7.Final'
api 'com.google.guava:guava:23.0'
testImplementation 'junit:junit:4.+'
}
실행
프로젝트에 의해 노출된 API의 일부가 아닌 프로젝트의 프로덕션 소스를 컴파일하는 데 필요한 종속성입니다.예를 들어 프로젝트는 내부 지속성 계층 구현에 최대 절전 모드를 사용합니다.
API
프로젝트에 의해 노출된 API의 일부인 프로젝트의 프로덕션 소스를 컴파일하는 데 필요한 종속성입니다.예를 들어 이 프로젝트는 Guava를 사용하고 메서드 서명에서 Guava 클래스에 대한 공개 인터페이스를 노출합니다.
@matpag와 @dev-bmax의 답변은 사람들이 구현과 api 간의 다양한 사용법을 이해할 수 있을 정도로 명확합니다.저는 다른 각도에서 추가적인 설명을 하고 싶습니다. 같은 질문을 하는 사람들에게 도움이 되기를 바랍니다.
테스트를 위한 두 가지 프로젝트를 만들었습니다.
- 프로젝트 A는 'frameworks-web-gradle-plugin'이라는 이름의 Java 라이브러리 프로젝트로서 'org.springframeworks'에 의존합니다.부트:spring-boot-gradle-plugin:1.5.20.릴리스'
- 프로젝트 B는 'com.example.frameworks.gradle:frameworks-web-gradle-plugin:0.0.1-SNAPshot' 구현에 따라 프로젝트 A에 종속됩니다.
위에서 설명한 종속성 계층은 다음과 같습니다.
[project-b] -> [project-a] -> [spring-boot-gradle-dll]
그런 다음 다음 시나리오를 테스트했습니다.
프로젝트 A를 만드는 것은 'org.spring framework'에 의존합니다.boot:spring-boot-gradle-plugin:1.5.20.RELEASE'를 구현합니다.
려달을 합니다.
gradle dependencies
다음 출력 스크린샷과 함께 프로젝트 B 루트 디르의 터미널에 있는 명령은 'spring-boot-gradle-plugin'이 런타임 클래스 경로 종속성 트리에 나타나는 것을 볼 수 있지만, compileClasspath의 것은 아닙니다. 그래서 구현을 사용하여 선언한 라이브러리를 사용할 수 없다고 생각합니다. 컴파일을 통해서만 할 수 없습니다.프로젝트 A를 만드는 것은 'org.spring framework'에 의존합니다.부트:spring-boot-gradle-plugin:1.5.20.Release' by api
려달을 합니다.
gradle dependencies
프로젝트 B 루트 디르의 터미널에서 명령을 다시 실행합니다.이제 'spring-boot-gradle-plugin'이 compileClasspath 및 runtimeClasspath 종속성 트리에 모두 나타납니다.
제가 주목한 중요한 차이점은 구현 방식으로 선언된 생산자/라이브러리 프로젝트의 종속성이 소비자 프로젝트의 compileClasspath에 나타나지 않으므로 소비자 프로젝트에서 해당 lib를 사용할 수 없다는 것입니다.
련노하더나에 관한 기술 한 더.api
대implementation
다음과 같은 종속성이 있다고 가정합니다.
dependencies {
api "com.example:foo:1.0"
implementation "com.example:bar:1.0"
}
메이븐▁help▁in▁of▁file▁if▁a()maven-publish
plugin)할 수 .pom.xml
파일은 다음과 같이 표시됩니다.
<dependency>
<groupId>com.example</groupId>
<artifactId>foo</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>bar</artifactId>
<version>1.0</version>
<scope>runtime</scope>
</dependency>
참고:api
변환되었습니다.compile
및 위및범implementation
에게runtime
범위. 범위. 범위.
이를 통해 이 라이브러리의 소비자는 컴파일 클래스 경로에 런타임 종속성이 있는 것을 방지할 수 있습니다.
이제 문서에 좋은 설명이 있습니다.
api 구성은 라이브러리 API에서 내보내는 종속성을 선언하는 데 사용되어야 하며 구현 구성은 구성 요소 내부의 종속성을 선언하는 데 사용되어야 합니다.
언급URL : https://stackoverflow.com/questions/44413952/gradle-implementation-vs-api-configuration
'programing' 카테고리의 다른 글
일식 작업 공간에서 문자열 검색 (0) | 2023.06.05 |
---|---|
규칙을 사용하여 시간 간격 가져오기 (0) | 2023.06.05 |
R 마크다운에 그림/표 삽입 (0) | 2023.06.05 |
py.test 테스트를 실행하도록 PyCharm을 구성하려면 어떻게 해야 합니까? (0) | 2023.06.05 |
Ruby로부터 Python 배우기; 차이점과 유사점 (0) | 2023.06.05 |