programing

Gradle 구현 대 API 구성

magicmemo 2023. 6. 5. 23:48
반응형

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이를 방지하기 위해 구성이 도입되었습니다.는 그서이당이신제를 하면,implementationapiMyLibrary:

dependencies {
    implementation(project(":InternalLibrary"))
}

당신은 전화를 할 수 없을 것입니다.InternalLibrary.giveMeAString()더 이상 당신의 앱 코드에서.

을 통해 은 러한종복플전통해이 Android Gradle 러당다있알니에서 하면 알 수.InternalLibrary다음의 재컴파일만 트리거해야 합니다.MyLibrary액세스 권한이 없기 때문에 전체 앱의 재컴파일이 아닙니다.InternalLibrary.

중첩된 종속성이 많은 경우 이 메커니즘은 빌드 속도를 크게 높일 수 있습니다. (이를 완전히 이해하려면 마지막에 링크된 비디오를 참조하십시오.)

결론들

  • 때, 은 당신의 Android Gradle 3.X를 .X로 전환할 때, 당신은 당신의 모든 것을 교체해야 합니다.compileimplementation키워드 *(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 lib2lib1,그리고나서app 수 있음 lib2때 :api lib1또는implementation lib1에 시대에app모듈.

나사 시용러를 할 때implementation lib2lib1,그리고나서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]

그런 다음 다음 시나리오를 테스트했습니다.

  1. 프로젝트 A를 만드는 것은 'org.spring framework'에 의존합니다.boot:spring-boot-gradle-plugin:1.5.20.RELEASE'를 구현합니다.

    려달을 합니다.gradle dependencies다음 출력 스크린샷과 함께 프로젝트 B 루트 디르의 터미널에 있는 명령은 'spring-boot-gradle-plugin'이 런타임 클래스 경로 종속성 트리에 나타나는 것을 볼 수 있지만, compileClasspath의 것은 아닙니다. 그래서 구현을 사용하여 선언한 라이브러리를 사용할 수 없다고 생각합니다. 컴파일을 통해서만 할 수 없습니다.

    여기에 이미지 설명 입력

  2. 프로젝트 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를 사용할 수 없다는 것입니다.

련노하더나에 관한 기술 한 더.apiimplementation다음과 같은 종속성이 있다고 가정합니다.

dependencies {
  api "com.example:foo:1.0"
  implementation "com.example:bar:1.0"
}

메이븐▁help▁in▁of▁file▁if▁a()maven-publishplugin)할 수 .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

반응형