A Gradle Plugin to determine which modules were affected by a set of files in a commit.

Overview

Affected Module Detector

Maven Central

Build Status

codecov

A Gradle Plugin to determine which modules were affected by a set of files in a commit. One use case for this plugin is for developers who would like to only run tests in modules which have changed in a given commit.

Overview

The AffectedModuleDetector will look at the last commit and determine which files have changed, it will then build a dependency graph of all the modules in the project. The detector exposes a set of APIs which can be used to determine whether a module was considered affected.

Git

The module detector assumes that it is being applied to a project stored in git and a git client is present on the system. It will query the last commit on the current branch to determine the list of files changed.

Dependency Tracker

The tracker will evaluate the project and find all modules and their dependencies for all configurations.

Affected Module Detector

The detector allows for three options for affected modules:

  • Changed Projects: These are projects which had files changed within them – enabled with -Paffected_module_detector.changedProjects)
  • Dependent Projects: These are projects which are dependent on projects which had changes within them – enabled with -Paffected_module_detector.dependentProjects)
  • All Affected Projects: This is the union of Changed Projects and Dependent Projects (this is the default configuration)

These options can be useful depending on how many tests your project has and where in the integration cycle you would like to run them. For example, Changed Projects may be a good options when initially sending a Pull Requests, and All Affected Projects may be useful to use when a developer merges their pull request.

The detector exposes APIs which will be helpful for your plugin to use. In particular, it exposes:

  • AffectedModuleDetector.configureTaskGuard - This will apply an onlyIf guard on your task and can be called either during configuration or execution
  • AffectedModuleDetector.isProjectAffected - This will return a boolean if the project has been affected. It can only be called after the project has been configured.

In the example below, we're showing a hypothetical project graph and what projects would be considered affected if the All Affected Projects option was used and a change was made in the :networking module.

Installation

Apply the project to the root build.gradle:

" } } //rootproject apply plugin: "com.dropbox.affectedmoduledetector" ">
buildscript {
  repositories {
    maven()
  }
  dependencies {
    classpath "com.dropbox.affectedmoduledetector:affectedmoduledetector:
   
    "
   
  }
}
//rootproject
apply plugin: "com.dropbox.affectedmoduledetector"

If you want to develop a plugin using the APIs, add this to your buildSrc's dependencies list:

") ">
implementation("com.dropbox.affectedmoduledetector:affectedmoduledetector:
   
    ")

   

Configuration

You can specify the configuration block for the detector in the root project:

affectedModuleDetector {
    baseDir = "${project.rootDir}"
    pathsAffectingAllModules = [
            "buildSrc/"
    ]
    logFilename = "output.log"
    logFolder = "${project.rootDir}/output"
    compareFrom = "PreviousCommit" //default is PreviousCommit
    excludedModules = [
        "sample-util"
    ]
}
  • baseDir: The root directory for all of the pathsAffectingAllModules. Used to validate the paths exist.
  • pathsAffectingAllModules: Paths to files or folders which if changed will trigger all modules to be considered affected
  • logFilename: A filename for the output detector to use
  • logFolder: A folder to output the log file in
  • specifiedBranch: A branch to specify changes against. Must be used in combination with configuration compareFrom = "SpecifiedBranchCommit"
  • compareFrom: A commit to compare the branch changes against. Can be either:
    • PreviousCommit: compare against the previous commit
    • ForkCommit: compare against the commit the branch was forked from
    • SpecifiedBranchCommit: specify the branch to compare changes against using the specifiedBranch configuration before the compareFrom configuration
  • excludedModules : A list of modules that will be excluded from the build process

Modules can specify a configuration block to specify which variant tests to run

affectedTestConfiguration{
   variantToTest = "debug" //default is debug
}

The plugin will create a few top level tasks that will assemble or run tests for only affected modules:

  • ./gradlew runAffectedUnitTests - runs jvm tests
  • ./gradlew runAffectedAndroidTests - runs connected tests
  • ./gradlew assembleAffectedAndroidTests - assembles but does not run on device tests, useful when working with device labs

Sample Usage

Running the plugin generated tasks is quite simple. By default, if affected_module_detector.enable is not set, the generated tasks will run on all the modules. However, the plugin offers three different modes of operation so that it only executes the given task on a subset of projects.

Running All Affected Projects (Changed Projects + Dependent Projects)

To run all the projects affected by a change, run one of the tasks while enabling the module detector.

./gradlew runAffectedUnitTests -Paffected_module_detector.enable

Running All Changed Projects

To run all the projects that changed, run one of the tasks (while enabling the module detector) and with -Paffected_module_detector.changedProjects

./gradlew runAffectedUnitTests -Paffected_module_detector.enable -Paffected_module_detector.changedProjects

Running All Dependent Projects

To run all the dependent projects of projects that changed, run one of the tasks (while enabling the module detector) and with -Paffected_module_detector.dependentProjects

./gradlew runAffectedUnitTests -Paffected_module_detector.enable -Paffected_module_detector.dependentProjects

Using the Sample project

To run this on the sample app:

  1. Publish the plugin to local maven:
./gradlew :affectedmoduledetector:publishToMavenLocal
  1. Try running the following command:
 ./gradlew runAffectedUnitTests -Paffected_module_detector.enable

You should see zero tests run. Make a change within one of the modules and commit it. Rerunning the command should execute tests in that module and its dependent modules.

Notes

Special thanks to the AndroidX for originally developing this project at https://android.googlesource.com/platform/frameworks/support/+/androidx-main/buildSrc/src/main/kotlin/androidx/build/dependencyTracker

Comments
  • Task 'runAffectedUnitTests' not found in root project

    Task 'runAffectedUnitTests' not found in root project

    Whenever I apply the plugin to a project and run the ./gradlew runAffectedUnitTests -Paffected_module_detector.enable command, I get the following error:

    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Task 'runAffectedUnitTests' not found in root project 'my-project'.
    

    Running ./gradle tasks or ./gradlew tasks -Paffected_module_detector.enable results in no tasks added by this plugin either.

    I have tried with multiple Android/Java only projects which all have different configurations, but all come up with the same results. I even copy pasted this entire block into the root build.gradle (thus having two buildscript blocks) to no success.

    buildscript {
      repositories {
        maven {
          url "https://plugins.gradle.org/m2/"
        }
      }
      dependencies {
        classpath "com.dropbox.affectedmoduledetector:affectedmoduledetector:0.1.0"
      }
    }
    apply plugin: "com.dropbox.affectedmoduledetector"
    
    opened by nhaarman 15
  • Add ability to compare between two branches

    Add ability to compare between two branches

    Currently, the git client will only query for HEAD~1 and determine the files in the last commit.

    We should add the ability to let a developer specify a branch to compare against and determine all the changed files between HEAD and that branch.

    We should configure this in the extension and let the user decide which option to use and the branch to compare against.

    enhancement 
    opened by chris-mitchell 12
  • Fix for comparing with uncommitted changes

    Fix for comparing with uncommitted changes

    Fixes https://github.com/dropbox/AffectedModuleDetector/issues/47

    If you make an uncommitted change and run the command:

    git --no-pager diff --name-only HEAD..$sha
    

    the uncommitted changes wont be displayed.

    If you run the command:

    git --no-pager diff --name-only $sha
    

    the uncommitted changes will be shown.

    This is because HEAD points to the last commit on the branch, therefore not considering any uncommitted changes made after that point.

    opened by jonnycaley 9
  • runAffectedUnitTests still runs all tests!

    runAffectedUnitTests still runs all tests!

    git status     
    On branch develop
    Your branch is up to date with 'origin/develop'.
    
    nothing to commit, working tree clean
    

    my configuration

    affectedModuleDetector {
        baseDir = "${project.rootDir}"
        pathsAffectingAllModules = setOf("gradle/libs.versions.toml")
        logFilename = "output.log"
        logFolder = "${rootProject.buildDir}/affectedModuleDetector"
        specifiedBranch = "develop"
        compareFrom = "SpecifiedBranchCommit" // default is PreviousCommit
    }
    

    ./gradlew runAffectedUnitTests -Paffected_module_detector.enable

    runs all tests I am using org.gradle.parallel=true. is this a problem?

    How to reproduce: please clone repo: https://github.com/xmlking/micro-apps and run above command.

    opened by xmlking 8
  • Feature request: Need support for includeBuild

    Feature request: Need support for includeBuild

    More details about includeBuild here

    Include build can be used as dependency, but for gradle that kind of dependency is external dependency. ProjectGraph can't work correct with includeBuild dependencies. For ProjectGraph includeBuild dependencies is external dependencies, not project dependencies. In that case not all modules can be found, and marked as unknownFiles.

    opened by rougsig 6
  • Issue159/full exclude excluded modules

    Issue159/full exclude excluded modules

    Issue159/full exclude excluded modules

    I tyied to solve this issue. We can see crashes on the excluded modules.

    I couldn't to reproduce this issue and logic of excluded modules works correctly.

    I couldn't to reproduce this issue and logic of excluded modules works correctly. But I suppose it might depend from configuration each custom task.

    I gess that the key problem available because we call task.dependsOn(affectedPath) and call other gradle logic on each module doesn't depends on the excluded or included one. Hence I thought that we can except call of extra code from withPlugin method for excluded modules at all. Because call task.dependsOn(affectedPath) and project.tasks.findByPath(affectedPath)?.onlyIf for excluded modules really unecessary.

    And I hope thes optimization help to solve this issue.

    What I did?

    1. Exepted calling extra code from withPlugin for excluded modules.
    2. Refactored getting AffectedModuleConfiguration and AffectedTestConfiguration using simple singletone pattern. Explanation: '- We can to know that module is excluded earlier via isModuleExcluded '- Optimization of shouldInclude method, because it called really quiqly and we can use cache of singletone now '- Getting of any configuration is the same approuch.

    What do they think about this?

    opened by Evleaps 5
  • runAffectedUnitTests -Paffected_module_detector.enable  fails on CI only

    runAffectedUnitTests -Paffected_module_detector.enable fails on CI only

    Hey, this was mentioned before but in my case it's only failing on CI When I run ./gradlew runAffectedUnitTests -Paffected_module_detector.enable on Bitrise it fails in my project with error:

    * What went wrong:
    Could not evaluate onlyIf predicate for task ':module:testDebugUnitTest'.
    > Nonzero exit value running git command.
    

    the task is working fine locally My git project is setup on CI and i do git clone before invoking this command

    opened by antwan-flinkhub 5
  • Not checking modules correctly

    Not checking modules correctly

    Apologies in advance if i'm using the plugin wrong.

    When running the plugin on my experimentation project it doesn't seem to be working correctly. If i make a change in a module that is an immediate dependency of the app module (either core or core-navigation) then the command ./gradlew runAffectedUnitTests -Paffected_module_detector.enable works correctly.

    However, if I make a change to a module that is a transitive dependency of core (e.g. feature-pokemondetail or feature-pokemonlist) then the output of the logs does not work correctly.

    Feel free to clone my repo and try for yourself. Any help appreciated 😄

    Screenshot 2020-12-10 at 09 36 01 Screenshot 2020-12-10 at 09 33 59
    opened by jonnycaley 5
  • Support exotic gradle projects

    Support exotic gradle projects

    ~~Will eventually fix~~ fixes #174 ~~however for the time being this only does~~ by doing the following:

    1. Cleans up the testing diagram in AffectedModuleDetectorImplTest
      • I found it a little difficult understanding the tests and how the diagram played a part in them so have renamed File (directory) references to d and the Gradle project references to p. We could have chosen any identifier but it was a little confusing for me that they were both the same not being familiar with the Gradle test tooling.
    2. Adds failing tests to highlight the issue better.
    3. Strips out ".." markers in the relative project paths so that we can directly compare the Git with Gradle.

    Here's a picture of how one might set up Gradle in this weird... quixotic..... way. (Excuse the typo in the screenshot :smile: )

    image

    The project is declared in the same way but it's location is changed from the default location. Perfectly valid in Gradle..... not very common.... and not (yet) supported in AMD. After this change we will be able to support both.

    opened by mezpahlan 4
  • excludedModules is not working with custom task.

    excludedModules is not working with custom task.

    Environment

    • macOS 12.5
    • Gradle 7.5
    • AMD 0.1.6
    • AGP 7.2.1
    • Detekt 1.21.0
    • Java 17
    • Kotlin 1.6.21

    Description

    I'm integrating AMD into my project and I created two custom tasks. When I run `./gradlew runAffectedDetekt', I'm getting this error even though linter is specified in the excludedModules.

    * What went wrong:
    Could not determine the dependencies of task ':runAffectedDetekt'.
    > Task with path ':linter:detekt' not found in root project 'Rappi-Android-User'.
    

    This error makes sense since Detekt is not applied in the linter module; however, it should be ignored by AMD if it's specified in the excluded modules.

    Configuration

        import com.dropbox.affectedmoduledetector.AffectedModuleConfiguration
    
        apply plugin: "com.dropbox.affectedmoduledetector"
    
        def branch = System.getenv('DESTINATION_BRANCH')
        if (!branch) {
            branch = "origin/develop"
        }
    
        logger.lifecycle("Destination branch: $branch")
    
        affectedModuleDetector {
            baseDir = "${project.rootDir}"
            pathsAffectingAllModules = [
                    "tools/global-dependencies.gradle"
            ]
            logFilename = "output.log"
            logFolder = "${project.rootDir}"
            specifiedBranch = "$branch"
            compareFrom = "SpecifiedBranchCommit"
            excludedModules = ["linter", ":linter"]
            customTasks = [
                    new AffectedModuleConfiguration.CustomTask(
                            "runAffectedDetekt,
                            "detekt",
                            "Run detekt"
                    ),
                    new AffectedModuleConfiguration.CustomTask(
                            "runAffectedAndroidLint",
                            "lintDebug",
                            "Run lint"
                    ),
            ]
    
    opened by GianfrancoMS 4
  • Error when adding to plugins {} block.

    Error when adding to plugins {} block.

    Hi,

    I am looking to set this up on our project and also leverage it for what modules to run lint for via custom plugin.

    Ideally, I would include this as part of our existing plugins block in root/build.gradle:

    plugins {
        ...
        ...
        id "com.dropbox.affectedmoduledetector" version "0.1.0.2"
    }
    

    The above results in an error (see below) but if I define the version as 0.1.0 it works. However, that's an older version.

    Build file '/Users/michael.carrano/Development/android-wwmobile/build.gradle' line: 45
    
    Plugin [id: 'com.dropbox.affectedmoduledetector', version: '0.1.0.2'] was not found in any of the following sources:
    
    * Try:
    Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    
    * Exception is:
    org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'com.dropbox.affectedmoduledetector', version: '0.1.0.2'] was not found in any of the following sources:
    
    - Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
    - Plugin Repositories (could not resolve plugin artifact 'com.dropbox.affectedmoduledetector:com.dropbox.affectedmoduledetector.gradle.plugin:0.1.0.2')
      Searched in the following repositories:
        Gradle Central Plugin Repository
    	...
    

    It looks like there are a few versions missing from https://plugins.gradle.org/plugin/com.dropbox.affectedmoduledetector and I'm not familiar with how to publish them there.

    Compare that to the versions listed at maven central: https://search.maven.org/artifact/com.dropbox.affectedmoduledetector/affectedmoduledetector

    For the time being, using the apply plugin method defined in the README works for me.

    opened by michaelcarrano 4
  • Bump gradle-maven-publish-plugin from 0.19.0 to 0.23.1

    Bump gradle-maven-publish-plugin from 0.19.0 to 0.23.1

    Bumps gradle-maven-publish-plugin from 0.19.0 to 0.23.1.

    Release notes

    Sourced from gradle-maven-publish-plugin's releases.

    0.23.1

    Changelog

    0.23.0

    Changelog

    0.22.0

    CHANGELOG

    0.21.0

    Changelog

    0.20.0

    Changelog

    Changelog

    Sourced from gradle-maven-publish-plugin's changelog.

    Version 0.23.1 (2022-12-30)

    • also support publishing sources for the java-test-fixtures plugin in Kotlin/JVM projects
    • suppress Gradle warnings when publishing a project that uses java-test-fixtures

    Version 0.23.0 (2022-12-29)

    Updated docs can be found on the new website.

    • NEW: It is now possible to set group id, artifact id directly through the DSL
      mavenPublishing {
        coordinates("com.example", "library", "1.0.3")
      }
      
    • project.group and project.version will still be used as default values for group and version if the GROUP/VERSION_NAME Gradle properties do not exist and coordinates was not called, however there are 2 behavior changes:
      • The GROUP and VERSION_NAME Gradle properties take precedence over project.group and project.version instead of being overwritten by them. If you need to define the properties but replace them for some projects, please use the new coordinates method instead.
      • The GROUP and VERSION_NAME Gradle properties will not be explicitly set as project.group and project.version anymore.
    • NEW: Added dropRepository task that will drop a Sonatype staging repository. It is possible to specify which repository to drop by adding a --repository parameter with the id of the staging repository that was printed during publish. If no repository is specified and there is only one staging repository, that one will be dropped.
    • Added workaround to also publish sources for the java-test-fixtures plugin
    • Fixed publishing Kotlin/JS projects with the base plugin.
    • Fixed that a POM configured through the DSL is incomplete when publishing Gradle plugins.
    • The minimum supported Gradle version has been increased to 7.3.

    Version 0.22.0 (2022-09-09)

    • NEW: When publishing to maven central by setting SONATYPE_HOST or calling publishToMavenCentral(...) the plugin will now explicitly create a staging repository on Sonatype. This avoids issues where a single build would create multiple repositories
    • The above change means that the plugin supports parallel builds and it is not neccessary anymore to use --no-parallel and --no-daemon together with publish
    • NEW: When publishing with the publish or publishAllPublicationsToMavenCentralRepository tasks the plugin will automatically close the staging repository at the end of the build if it was successful.
    • NEW: Option to also automatically release the staging repository after closing was susccessful
    SONATYPE_HOST=DEFAULT # or S01
    SONATYPE_AUTOMATIC_RELEASE=true
    

    or

    mavenPublishing {
      publishToMavenCentral("DEFAULT", true)
      // or publishToMavenCentral("S01", true)
    </tr></table> 
    

    ... (truncated)

    Commits
    • 55b2fbf Prepare for release 0.23.1.
    • 925f5d2 also setup test fixtures sources jar for Kotlin/JVM, suppress warnings (#486)
    • a05892d update branch name in actions
    • 08f2406 test against Gradle 8.0-rc-1 (#485)
    • 6f60a18 remove unused test dependencies (#484)
    • aae16f7 Update dependency com.vanniktech:gradle-maven-publish-plugin to v0.23.0 (#483)
    • 8d84276 Prepare for next development version
    • 1f8a8c1 Prepare for release 0.23.0.
    • c6d8640 typo2
    • bc3a43e typo
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump kotlin_version from 1.6.20 to 1.8.0

    Bump kotlin_version from 1.6.20 to 1.8.0

    Bumps kotlin_version from 1.6.20 to 1.8.0. Updates kotlin-gradle-plugin from 1.6.20 to 1.8.0

    Release notes

    Sourced from kotlin-gradle-plugin's releases.

    Kotlin 1.8.0

    Changelog

    Analysis API

    • KT-50255 Analysis API: Implement standalone mode for the Analysis API

    Analysis API. FIR

    • KT-54292 Symbol Light classes: implement PsiVariable.computeConstantValue for light field
    • KT-54293 Analysis API: fix constructor symbol creation when its accessed via type alias

    Android

    • KT-53342 TCS: New AndroidSourceSet layout for multiplatform
    • KT-53013 Increase AGP compile version in KGP to 4.1.3
    • KT-54013 Report error when using deprecated Kotlin Android Extensions compiler plugin
    • KT-53709 MPP, Android SSL2: Conflicting warnings for androidTest/kotlin source set folder

    Backend. Native. Debug

    • KT-53561 Invalid LLVM module: "inlinable function call in a function with debug info must have a !dbg location"

    Compiler

    New Features

    • KT-52817 Add @JvmSerializableLambda annotation to keep old behavior of non-invokedynamic lambdas
    • KT-54460 Implementation of non-local break and continue
    • KT-53916 Support Xcode 14 and new Objective-C frameworks in Kotlin/Native compiler
    • KT-32208 Generate method annotations into bytecode for suspend lambdas (on invokeSuspend)
    • KT-53438 Introduce a way to get SourceDebugExtension attribute value via JVMTI for profiler and coverage

    Performance Improvements

    • KT-53347 Get rid of excess allocations in parser
    • KT-53689 JVM: Optimize equality on class literals
    • KT-53119 Improve String Concatenation Lowering

    Fixes

    • KT-53465 Unnecessary checkcast to array of reified type is not optimized since Kotlin 1.6.20
    • KT-49658 NI: False negative TYPE_MISMATCH on nullable type with when
    • KT-48162 NON_VARARG_SPREAD isn't reported on *toTypedArray() call
    • KT-43493 NI: False negative: no compilation error "Operator '==' cannot be applied to 'Long' and 'Int'" is reported in builder inference lambdas
    • KT-54393 Change in behavior from 1.7.10 to 1.7.20 for java field override.
    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-48532 Remove old JVM backend

    ... (truncated)

    Changelog

    Sourced from kotlin-gradle-plugin's changelog.

    1.8.0

    Analysis API

    • KT-50255 Analysis API: Implement standalone mode for the Analysis API

    Analysis API. FIR

    • KT-54292 Symbol Light classes: implement PsiVariable.computeConstantValue for light field
    • KT-54293 Analysis API: fix constructor symbol creation when its accessed via type alias

    Android

    • KT-53342 TCS: New AndroidSourceSet layout for multiplatform
    • KT-53013 Increase AGP compile version in KGP to 4.1.3
    • KT-54013 Report error when using deprecated Kotlin Android Extensions compiler plugin
    • KT-53709 MPP, Android SSL2: Conflicting warnings for androidTest/kotlin source set folder

    Backend. Native. Debug

    • KT-53561 Invalid LLVM module: "inlinable function call in a function with debug info must have a !dbg location"

    Compiler

    New Features

    • KT-52817 Add @JvmSerializableLambda annotation to keep old behavior of non-invokedynamic lambdas
    • KT-54460 Implementation of non-local break and continue
    • KT-53916 Support Xcode 14 and new Objective-C frameworks in Kotlin/Native compiler
    • KT-32208 Generate method annotations into bytecode for suspend lambdas (on invokeSuspend)
    • KT-53438 Introduce a way to get SourceDebugExtension attribute value via JVMTI for profiler and coverage

    Performance Improvements

    • KT-53347 Get rid of excess allocations in parser
    • KT-53689 JVM: Optimize equality on class literals
    • KT-53119 Improve String Concatenation Lowering

    Fixes

    • KT-53465 Unnecessary checkcast to array of reified type is not optimized since Kotlin 1.6.20
    • KT-49658 NI: False negative TYPE_MISMATCH on nullable type with when
    • KT-48162 NON_VARARG_SPREAD isn't reported on *toTypedArray() call
    • KT-43493 NI: False negative: no compilation error "Operator '==' cannot be applied to 'Long' and 'Int'" is reported in builder inference lambdas
    • KT-54393 Change in behavior from 1.7.10 to 1.7.20 for java field override.
    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-48532 Remove old JVM backend
    • KT-55065 Kotlin Gradle DSL: Reflection cannot find class data for lambda, produced by JVM IR backend

    ... (truncated)

    Commits
    • da1a843 Add ChangeLog for 1.8.0-RC2
    • d325cf8 Call additional publishToMavenLocal in maven build scripts and enable info
    • 0403d70 Don't leave Gradle daemons after build scripts
    • 52b225d Fix task module-name is not propagated to compiler arguments
    • d40ebc3 Specify versions-maven-plugin version explicitly
    • 2e829ed Fix version parsing crash on Gradle rich version string
    • f603c0e Scripting, IR: fix capturing of implicit receiver
    • 06cbf8f Scripting, tests: enable custom script tests with IR
    • d61cef0 Fix deserialization exception for DNN types from Java
    • ea33e72 JVM IR: script is a valid container for local delegated properties
    • Additional commits viewable in compare view

    Updates kotlin-stdlib from 1.6.20 to 1.8.0

    Release notes

    Sourced from kotlin-stdlib's releases.

    Kotlin 1.8.0

    Changelog

    Analysis API

    • KT-50255 Analysis API: Implement standalone mode for the Analysis API

    Analysis API. FIR

    • KT-54292 Symbol Light classes: implement PsiVariable.computeConstantValue for light field
    • KT-54293 Analysis API: fix constructor symbol creation when its accessed via type alias

    Android

    • KT-53342 TCS: New AndroidSourceSet layout for multiplatform
    • KT-53013 Increase AGP compile version in KGP to 4.1.3
    • KT-54013 Report error when using deprecated Kotlin Android Extensions compiler plugin
    • KT-53709 MPP, Android SSL2: Conflicting warnings for androidTest/kotlin source set folder

    Backend. Native. Debug

    • KT-53561 Invalid LLVM module: "inlinable function call in a function with debug info must have a !dbg location"

    Compiler

    New Features

    • KT-52817 Add @JvmSerializableLambda annotation to keep old behavior of non-invokedynamic lambdas
    • KT-54460 Implementation of non-local break and continue
    • KT-53916 Support Xcode 14 and new Objective-C frameworks in Kotlin/Native compiler
    • KT-32208 Generate method annotations into bytecode for suspend lambdas (on invokeSuspend)
    • KT-53438 Introduce a way to get SourceDebugExtension attribute value via JVMTI for profiler and coverage

    Performance Improvements

    • KT-53347 Get rid of excess allocations in parser
    • KT-53689 JVM: Optimize equality on class literals
    • KT-53119 Improve String Concatenation Lowering

    Fixes

    • KT-53465 Unnecessary checkcast to array of reified type is not optimized since Kotlin 1.6.20
    • KT-49658 NI: False negative TYPE_MISMATCH on nullable type with when
    • KT-48162 NON_VARARG_SPREAD isn't reported on *toTypedArray() call
    • KT-43493 NI: False negative: no compilation error "Operator '==' cannot be applied to 'Long' and 'Int'" is reported in builder inference lambdas
    • KT-54393 Change in behavior from 1.7.10 to 1.7.20 for java field override.
    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-48532 Remove old JVM backend

    ... (truncated)

    Changelog

    Sourced from kotlin-stdlib's changelog.

    1.8.0

    Analysis API

    • KT-50255 Analysis API: Implement standalone mode for the Analysis API

    Analysis API. FIR

    • KT-54292 Symbol Light classes: implement PsiVariable.computeConstantValue for light field
    • KT-54293 Analysis API: fix constructor symbol creation when its accessed via type alias

    Android

    • KT-53342 TCS: New AndroidSourceSet layout for multiplatform
    • KT-53013 Increase AGP compile version in KGP to 4.1.3
    • KT-54013 Report error when using deprecated Kotlin Android Extensions compiler plugin
    • KT-53709 MPP, Android SSL2: Conflicting warnings for androidTest/kotlin source set folder

    Backend. Native. Debug

    • KT-53561 Invalid LLVM module: "inlinable function call in a function with debug info must have a !dbg location"

    Compiler

    New Features

    • KT-52817 Add @JvmSerializableLambda annotation to keep old behavior of non-invokedynamic lambdas
    • KT-54460 Implementation of non-local break and continue
    • KT-53916 Support Xcode 14 and new Objective-C frameworks in Kotlin/Native compiler
    • KT-32208 Generate method annotations into bytecode for suspend lambdas (on invokeSuspend)
    • KT-53438 Introduce a way to get SourceDebugExtension attribute value via JVMTI for profiler and coverage

    Performance Improvements

    • KT-53347 Get rid of excess allocations in parser
    • KT-53689 JVM: Optimize equality on class literals
    • KT-53119 Improve String Concatenation Lowering

    Fixes

    • KT-53465 Unnecessary checkcast to array of reified type is not optimized since Kotlin 1.6.20
    • KT-49658 NI: False negative TYPE_MISMATCH on nullable type with when
    • KT-48162 NON_VARARG_SPREAD isn't reported on *toTypedArray() call
    • KT-43493 NI: False negative: no compilation error "Operator '==' cannot be applied to 'Long' and 'Int'" is reported in builder inference lambdas
    • KT-54393 Change in behavior from 1.7.10 to 1.7.20 for java field override.
    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-48532 Remove old JVM backend
    • KT-55065 Kotlin Gradle DSL: Reflection cannot find class data for lambda, produced by JVM IR backend

    ... (truncated)

    Commits
    • da1a843 Add ChangeLog for 1.8.0-RC2
    • d325cf8 Call additional publishToMavenLocal in maven build scripts and enable info
    • 0403d70 Don't leave Gradle daemons after build scripts
    • 52b225d Fix task module-name is not propagated to compiler arguments
    • d40ebc3 Specify versions-maven-plugin version explicitly
    • 2e829ed Fix version parsing crash on Gradle rich version string
    • f603c0e Scripting, IR: fix capturing of implicit receiver
    • 06cbf8f Scripting, tests: enable custom script tests with IR
    • d61cef0 Fix deserialization exception for DNN types from Java
    • ea33e72 JVM IR: script is a valid container for local delegated properties
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Add an option to exclude jvm test paths

    Add an option to exclude jvm test paths

    Hey,

    Could it be possible to add support to exclude certain path(s) from jvm test execution?

    There is a exclude(Iterable<String> excludes) function in org.gradle.api.tasks.testing.Test class for it.

    Use case: We need it to avoid running e.g. paparazzi screenshot tests as part of main unit test task launched by runAffectedUnitTests task.

    Up until now we use command line parameter:

    -PexcludeTests="**/screenshots/**, **/another_excluded_path/**" That is being read and applied in testOptions.unitTest block

    opened by shanio 0
  • CustomTask should use Gradle's NamedDomainObjectContainer or NamedDomainObjectSet

    CustomTask should use Gradle's NamedDomainObjectContainer or NamedDomainObjectSet

    See https://github.com/dropbox/AffectedModuleDetector/pull/130/files#diff-6b5be434aa24824fb2973ce77a9dcda484db988e76842f367fb289129851c318R44

    var customTasks = emptySet<AffectedModuleConfiguration.CustomTask>() would be better migrated to DomainObject APIs. Here's a relevant article: https://blog.mrhaki.com/2016/02/gradle-goodness-create-objects-with-dsl.html

    opened by vlsi 1
  • See if we can make tasks cacheable

    See if we can make tasks cacheable

    This will be a tracking ticket. In 0.1.6 we will be marking those tasks as not cacheable but would like to investigate if it's possible to somehow do this. Our current problem is this stack trace

    Caused by: org.gradle.api.UnknownDomainObjectException: Extension with name 'AffectedModuleDetectorPlugin' does not exist. Currently registered extension names: [ext]
            at org.gradle.internal.extensibility.ExtensionsStorage.unknownExtensionException(ExtensionsStorage.java:144)
            at org.gradle.internal.extensibility.ExtensionsStorage.getByName(ExtensionsStorage.java:123)
            at org.gradle.internal.extensibility.DefaultConvention.getByName(DefaultConvention.java:174)
            at com.dropbox.affectedmoduledetector.AffectedModuleDetector$Companion.getInstance(AffectedModuleDetector.kt:195)
            at com.dropbox.affectedmoduledetector.AffectedModuleDetector$Companion.getOrThrow(AffectedModuleDetector.kt:200)
            at com.dropbox.affectedmoduledetector.AffectedModuleDetector$Companion.configureTaskGuard$lambda-3(AffectedModuleDetector.kt:233)
            at org.gradle.api.specs.AndSpec.isSatisfiedBy(AndSpec.java:50)
            at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:44)
            ... 24 more
    
    

    As noted in this slack message on the gradle slack, the apply method is not called on plugins which cached so the call in our onlyIf block to check if a project is enabled and affected no longer works. If we could move that check into the task possibly rather then the plugin maybe this is doable

    help wanted 
    opened by joshafeinberg 0
Releases(v0.2.0)
  • v0.2.0(Nov 2, 2022)

    What's Changed

    • Prepare next development version. by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/158
    • Bump gradle from 7.1.3 to 7.3.0 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/166
    • Small refactoring by @Evleaps in https://github.com/dropbox/AffectedModuleDetector/pull/173
    • Bump gradle from 7.3.0 to 7.3.1 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/171
    • Excluded modules should not be added to task graph by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/167
    • Switch registering tasks to lazy by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/170
    • Feature/new specified branch commit by @Evleaps in https://github.com/dropbox/AffectedModuleDetector/pull/164
    • Experimental Windows support - take 2 by @mezpahlan in https://github.com/dropbox/AffectedModuleDetector/pull/172

    New Contributors

    • @mezpahlan made their first contribution in https://github.com/dropbox/AffectedModuleDetector/pull/172

    Full Changelog: https://github.com/dropbox/AffectedModuleDetector/compare/v0.1.6...v0.2.0

    Source code(tar.gz)
    Source code(zip)
  • v0.1.6(Jul 19, 2022)

    What's Changed

    • Prepare for release 0.1.5. by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/136
    • Prepare next development version. by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/137
    • Feature: New approach for creating custom command for impact analysis by @Evleaps in https://github.com/dropbox/AffectedModuleDetector/pull/130
    • Fix code to better support when running project with configuration cache by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/144
    • Added link to the AffectedModuleTaskType interface by @Evleaps in https://github.com/dropbox/AffectedModuleDetector/pull/156
    • Upgrade Gradle Plugin so we can have knowledge of how to disable config cache by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/152
    • Make ToStringLogger config cacheable by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/151
    • Prepare for release 0.1.6. by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/157

    New Contributors

    • @Evleaps made their first contribution in https://github.com/dropbox/AffectedModuleDetector/pull/130

    Full Changelog: https://github.com/dropbox/AffectedModuleDetector/compare/v0.1.5...v0.1.6

    Source code(tar.gz)
    Source code(zip)
  • v0.1.5(Apr 15, 2022)

    What's Changed

    • Prepare for release 0.1.4. by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/121
    • Prepare next development version. by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/122
    • Update to new Sonatype host by @changusmc in https://github.com/dropbox/AffectedModuleDetector/pull/124
    • Upgrade gradle and plugin version for library and sample app by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/127
    • Upgrade all the things by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/133
    • Publish plugin marker artifact by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/135
    • Support java modules better by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/134

    Full Changelog: https://github.com/dropbox/AffectedModuleDetector/compare/v0.1.4...v0.1.5

    Source code(tar.gz)
    Source code(zip)
  • v0.1.4(Feb 25, 2022)

    What's Changed

    • Bump gradle from 7.0.3 to 7.0.4 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/91
    • Mark all projects changed if file effecting all modules changes by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/105
    • Update release steps by @chris-mitchell in https://github.com/dropbox/AffectedModuleDetector/pull/107
    • Prepare for release 0.1.3 by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/108
    • Add "v" prefix to release notes by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/110
    • Prepare next development version. by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/109
    • Adds license to readme. by @rharter in https://github.com/dropbox/AffectedModuleDetector/pull/112
    • Add support for toggling if uncommitted code should be included by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/113
    • Task Configuration Avoidance fixes by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/117
    • Upgrade sample app to Kotlin 1.6.10 and ensure it builds on CI by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/116
    • Add check for if project is provided before adding dependent task by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/119

    New Contributors

    • @rharter made their first contribution in https://github.com/dropbox/AffectedModuleDetector/pull/112

    Full Changelog: https://github.com/dropbox/AffectedModuleDetector/compare/v0.1.3...v0.1.4

    Source code(tar.gz)
    Source code(zip)
  • v0.1.3(Jan 18, 2022)

    What's Changed

    • Fix issue with moved files not being found when running git diff by @chris-mitchell in https://github.com/dropbox/AffectedModuleDetector/pull/61
    • Ensure pathsAffectingAllBuilds will include any changed files by @chris-mitchell in https://github.com/dropbox/AffectedModuleDetector/pull/65
    • Add Github Actions by @changusmc in https://github.com/dropbox/AffectedModuleDetector/pull/72
    • Update release code and gpg key by @changusmc in https://github.com/dropbox/AffectedModuleDetector/pull/73
    • Delete .travis.yml by @changusmc in https://github.com/dropbox/AffectedModuleDetector/pull/74
    • Clean up gpg keys by @changusmc in https://github.com/dropbox/AffectedModuleDetector/pull/75
    • adding dependabot by @AlekKras in https://github.com/dropbox/AffectedModuleDetector/pull/78
    • Execute perms for clean up script by @changusmc in https://github.com/dropbox/AffectedModuleDetector/pull/76
    • Bump org.jacoco.core from 0.8.5 to 0.8.7 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/84
    • Bump gradle from 4.1.0 to 7.0.2 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/81
    • Bump junit from 4.13.1 to 4.13.2 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/83
    • Bump ktlint-gradle from 9.1.1 to 10.2.0 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/80
    • Bump gradle from 7.0.2 to 7.0.3 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/86
    • Bump kotlin_version from 1.4.10 to 1.5.31 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/85
    • Bump kotlin_version from 1.5.31 to 1.6.0 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/87
    • Move to Gradle publish plugin by @changusmc in https://github.com/dropbox/AffectedModuleDetector/pull/92
    • Fix documentation referencing an unused configuration property by @chris-mitchell in https://github.com/dropbox/AffectedModuleDetector/pull/96
    • Fix readme maven typo by @rougsig in https://github.com/dropbox/AffectedModuleDetector/pull/97
    • Fix maven repo readme typo again by @rougsig in https://github.com/dropbox/AffectedModuleDetector/pull/98
    • Bump kotlin_version from 1.6.0 to 1.6.10 by @dependabot in https://github.com/dropbox/AffectedModuleDetector/pull/94
    • Remove jCenter and replace with mavenCentral by @joshafeinberg in https://github.com/dropbox/AffectedModuleDetector/pull/104

    New Contributors

    • @changusmc made their first contribution in https://github.com/dropbox/AffectedModuleDetector/pull/72
    • @AlekKras made their first contribution in https://github.com/dropbox/AffectedModuleDetector/pull/78
    • @rougsig made their first contribution in https://github.com/dropbox/AffectedModuleDetector/pull/97

    Full Changelog: https://github.com/dropbox/AffectedModuleDetector/compare/v0.1.2...v0.1.3

    Source code(tar.gz)
    Source code(zip)
  • v0.1.2(Dec 13, 2021)

Owner
Dropbox
Dropbox
A Gradle plugin to help analyse the dependency between modules and run tasks only on modules impacted by specific set of changes.

Change Tracker Plugin A Gradle plugin to help analyse the dependency between modules and run tasks only on modules impacted by specific set of changes

Ismael Di Vita 110 Dec 19, 2022
Graphfity is a Gradle Plugin which creates a dependency node diagram graph about your internal modules dependencies, specially useful if you are developing a multi-module application

Graphfity creates a dependency nodes diagram graph about your internal modules dependencies, specially useful if you are developing a multi-module app

Iván Carrasco 27 Dec 20, 2022
A Gradle plugin that helps you speed up builds by excluding unnecessary modules.

?? Focus A Gradle plugin that generates module-specific settings.gradle files, allowing you to focus on a specific feature or module without needing t

Dropbox 314 Jan 2, 2023
Gradle Plugin that determines if modules are Kotlin Multiplatform (KMP) ready.

Gradle Plugin that determines if modules are Kotlin Multiplatform (KMP) ready. KMP Ready means that the code is Kotlin Multiplatform compatible.

Sam Edwards 58 Dec 22, 2022
Gradle plugin to ease Kotlin IR plugin development and usage in multimodule gradle projects

Gradle plugin to ease Kotlin IR plugin development and usage in multimodule gradle projects. Former: kotlin-ir-plugin-adapter-gradle

null 2 Mar 8, 2022
A Gradle plugin that generates plugin.yml for Bukkit/BungeeCord/Nukkit plugins based on the Gradle project

plugin-yml is a simple Gradle plugin that generates the plugin.yml plugin description file for Bukkit plugins, bungee.yml for Bungee plugins or nukkit.yml for Nukkit plugins based on the Gradle project. Various properties are set automatically (e.g. project name, version or description) and additional properties can be added using a simple DSL.

Plexus 0 Apr 10, 2022
Grazel is a Gradle plugin to automate generation of valid Bazel files for a given Android/Kotlin/Java project.

Grazel Grazel stands for Gradle to Bazel. It is a Gradle plugin that enables you to migrate Android projects to Bazel build system in an incremental a

Grab 228 Jan 2, 2023
Gradle Plugin to automatically upgrade your gradle project dependencies and send a GitHub pull request with the changes

Gradle Plugin to automatically upgrade your gradle project dependencies and send a GitHub pull request with the changes

Dipien 142 Dec 29, 2022
Gradle Plugin that allows you to decompile bytecode compiled with Jetpack Compose Compiler Plugin into Java and check it

decomposer Gradle Plugin that allows you to decompile bytecode compiled with Jetpack Compose Compiler Plugin into Java and check it How to use Run bui

Takahiro Menju 56 Nov 18, 2022
Gradle plugin which validates the licenses of your dependency graph match what you expect

Gradle plugin which validates the licenses of your dependency graph match what you expect

Cash App 502 Dec 31, 2022
Gradle plugin which analyzes the size of your Android apps

Scope is a Gradle plugin which helps you analyze the size of your Android apps. Motivation App size is an important metric which directly correlates w

Nanashi Li 1 Feb 26, 2022
Gradle Plugin to enable auto-completion and symbol resolution for all Kotlin/Native platforms.

CompleteKotlin Gradle Plugin to enable auto-completion and symbol resolution for all Kotlin/Native platforms. What this plugin provides This zero-conf

Louis CAD 235 Jan 3, 2023
A Gradle plugin that improves the experience when developing Android apps, especially system tools, that use hidden APIs.

A Gradle plugin that improves the experience when developing Android apps, especially system tools, that use hidden APIs.

Rikka apps 124 Dec 31, 2022
Gradle Plugin for Continuous Integration of AppSweep App Testing.

This Gradle plugin can be used to continuously integrate app scanning using AppSweep into your Android app build process

Guardsquare 28 Nov 13, 2022
Artifactory is a gradle plugin to assist in developing Minecraft mods that can target different modloaders.

Artifactory Artifactory is a gradle plugin to assist in developing Minecraft mods that can target different modloaders. Currently, Fabric and Forge ar

Zach Kozar 3 Dec 29, 2021
EasyVersion is a Gradle plugin that manage your app or library version.

EasyVersion EasyVersion is a Gradle plugin that manage your app or library version. Before Downloading Create easy_version.json in your root project d

Kosh Sergani 8 Nov 26, 2022
Android Gradle Plugin -- Auto Check big image and compress image in building.

McImage I will continue to update, please rest assured to use 中文文档 Android优雅的打包时自动化获取全部res资源 McImage is a Non-invasive plugin for compress all res in

smallSohoSolo 1.1k Dec 28, 2022
Gradle plugin that generates a Swift Package Manager manifest and an XCFramework to distribute a Kotlin Multiplatform library for Apple platforms.

Multiplatform Swift Package This is a Gradle plugin for Kotlin Multiplatform projects that generates an XCFramework for your native Apple targets and

Georg Dresler 262 Jan 5, 2023
A Gradle plugin helps to proxy all the BuildConfig fields in the Android project.

Readme A Gradle plugin helps to proxy all the BuildConfig fields in the Android project. Background In android BuildConfig, We might have different co

Jack Chen 4 Oct 11, 2021