diff --git a/.gitignore b/.gitignore index eaeb95b..508886f 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,7 @@ captures/ # Intellij *.iml -.idea +.idea/ # Keystore files *.jks diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index be6c363..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index cc1e4a9..df73c33 100644 --- a/README.md +++ b/README.md @@ -1,133 +1,125 @@ # MicroModule -Rebuild multiple complete module structures within the module. Each complete module structure we called it MicroModule, Each MicroModule has its own `build.gradle` file where you can add configuration options to publish MicroModule(aar) to Maven and declare MicroModule dependencies. In addition, you can decide which MicroModules participate in the compilation of the module. +重新定义Android模块结构,在模块内部可以创建多个和模块结构一致的微模块(MicroModule)。每一个MicroModule的结构和Android模块结构保持一致,也会有自己的`build.gradle`。另外,你可以很方便的配置哪些MicroModule参与APK的编译。 ## Usage -### Add MicroModule plugin **classpath** in root project build.gradle: - buildscript { - dependencies { - ... - classpath 'com.eastwood.tools.plugins:micro-module:1.3.2' - } - } - -### Apply MicroModule plugin in application or library module build.gradle and add configuration options: - - apply plugin: 'micro-module' - apply plugin: 'com.android.library' // or 'com.android.application' - - android {} +### 在根项目`build.gradle`中添加MicroModule插件依赖: - microModule { - ... - } - - dependencies {} +``` +buildscript { + dependencies { + ... + classpath 'com.eastwood.tools.plugins:micro-module:1.4.0' + } +} +``` -Apply MicroModule plugin **must before** apply android plugin, and `microModule {}` should between `android {}` and `dependencies {}`. +### 在`application`或`library`类型的模块`build.gradle`中添加MicroModule插件: -The MicroModule plugin defines the following methods in `microModule {}`: -* **`codeCheckEnabled`**--`boolean` +``` +apply plugin: 'micro-module' +apply plugin: 'com.android.library' // or 'com.android.application' - Prevent two non-dependent MicroModules from generating references. Use `codeCheckEnabled` to declared code check enable state, 'true' as default. +android {} -* **`includeMain`**--`String` +microModule { + ... +} - Declare main MicroModule, affects the package name of the generated R class, and the AndroidManifest.xml merge. if not declared, will be declared as default if file with name `main` exist. +dependencies {} +``` -* **`include`**--`String[]` +注意:MicroModule插件需要添加在android相关插件之前,相关配置`microModule {}` 需要添加在 `android {}` 和 `dependencies {}`之间。 - Declare other MicroModules. +### microModule属性说明 -* **`export`**--`String[]` +* **`include`** - Use `export` to decide which MicroModules participate in the compilation of the module. if not declared, all MicroModules which decleard by `include`, will participate in the compilation of the module. + 声明一个或多个MicroModule,类似于`setting.gradle`中的`include`,MicroModule目录名即为MicroModule的名称。 + ``` + microModule { + include 'p_base', 'p_common' -*Example 1. build.gradle file of library module in the dome.* + // 可以根据条件动态声明 + if(debug) { + include 'debug' + } else { + include 'debug' + } + } + ``` - microModule { - codeCheckEnabled true - include ':p_base' - include ':p_common' - include ':p_utils' - export ':main' - } +* **`export`** -### Declare MicroModule dependencies in MicroModule build.gradle: -The MicroModule plugin provides a simple method for declaring dependencies on other MicroModules in `dependencies {}`. + 配置参与APK编译的MicroModule。如果未配置`export`,则所有`include`的MicroModule都会参与APK编译。 - dependencies { - implementation microModule(':p_common') - } + ``` + microModule { + include 'feature_A', 'feature_B', 'feature_C' + export 'feature_A', 'feature_B' + } + ``` -The method **`microModule`** has a only `string` parameter, the name of the MicroModule. +* **`includeMain`** -You can also declare dependencies on the other third party libraries in `dependencies {}`. + 指定主MicroModule。 + 当前模块的其他MicroModule的`AndroidManifest.xml`,将会合入主MicroModule的`AndroidManifest.xml`,并存放在`build/microModule/merge-manifest/`下。另外,当前模块的R类包名也将由主模块`AndroidManifest.xml`的`package`决定。 -*Example 2. build.gradle file of main MicroModule in the demo.* + 默认主MicroModule为目录名为`main`的MicroModule。通过[MicroModule Android Studio插件](#jump)的转换功能,将模块转换成MicroModule格式时,无需指定主模块。转换功能工作只是创建一个`main`目录,并将原先`src`移动到`main`目录下,以及其他操作。 - dependencies { - implementation fileTree(dir: 'main/libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:27.1.1' - implementation 'com.android.support.constraint:constraint-layout:1.1.0' - implementation microModule(':p_common') - } +* **`codeCheckEnabled`** -### Publish MicroModule(AAR) to Maven repository: -The MicroModule plugin adds support for compiling single MicroModule into an Android Archive (AAR) file, and publishing AAR file to Maven repository. + 是否开启MicroModule代码边界检查,默认不开启检查。 -The MicroModule plugin provides a factory method for creating a maven artifact. After you add configuration option of creating a maven artifact and run gradle sync, the MicroModule plugin will create a relatived upload task which publishing AAR file to Maven repository. + 有些场景下可能想使MicroModule在模块中保持独立,其类或资源不被该模块的其他MicroModule引用。代码边界检查在`sync&build`的时候进行,检测到没有依赖而存在引用时,会报错以及停止`sync&build`,并输出相应日志提示。 -*Example 3. Creating a maven artifact.* + 开启代码边界检查后,一个模块内的MicroModule之间,需要声明依赖关系。例如: + ``` + // Module build.gradle - microModule { - mavenArtifact { - groupId 'com.eastwood.demo' - artifactId 'library-base' - version '1.0.0-SNAPSHOT' + microModule { + codeCheckEnabled true - repository { - url "***" - authentication(userName: '***', password: '***') - } - } - } + include 'p_base', 'p_common' + include 'feature_A', 'feature_B' - + export 'feature_A' + } + // MicroModule feature_A build.gradle -After publishing MicroModule AAR file to Maven repository, you can use it as a dependency instead of the local source code. All you have to do is add the attribute `useMavenArtifact` and set it to true. + dependencies { + implementation microModule(':p_base') + implementation microModule(':p_common') + } -*Example 4. the complete example of the MicroModule build.gradle file.* + // MicroModule feature_B build.gradle - microModule { - useMavenArtifact true - mavenArtifact { - groupId 'com.eastwood.demo' - artifactId 'library-base' - version '1.0.0-SNAPSHOT' + dependencies { + implementation microModule(':p_base') + implementation microModule(':p_common') + } + ``` - repository { - url "***" - authentication(userName: '***', password: '***') - } - } - } + 另外MicroModule所需的依赖,也可以在各自的`build.gradle` `dependencies {}`中声明(此处的依赖不在代码边界检查范围之内)。 - dependencies { - implementation fileTree(dir: 'main/libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:27.1.1' - implementation 'com.android.support.constraint:constraint-layout:1.1.0' + ``` + dependencies { + implementation fileTree(dir: 'main/libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:27.1.1' + implementation 'com.android.support.constraint:constraint-layout:1.1.0' - implementation microModule(':p_common') - } + implementation microModule(':p_base') + implementation microModule(':p_common') + } + ``` -## MicroModule Android Studio Plugin +## MicroModule Android Studio Plugin Provides an action which allow you quickly create MicroModule or convert module to MicroModule. * Right click at module dir, in [New] group, you will find "MicroModule" action. * Right click at module dir, in [Refactor] group, you will find "Convert to MicroModule" action. @@ -146,6 +138,9 @@ Provides an action which allow you quickly create MicroModule or convert module [https://plugins.jetbrains.com/plugin/10785-micromodule](https://plugins.jetbrains.com/plugin/10785-micromodule) +## Question or Idea +有问题或想法可以直接加我微信: EastWoodYang + ## License ``` diff --git a/application/p_base/src/main/java/com/eastwood/demo/application/base/Base.java b/application/p_base/src/main/java/com/eastwood/demo/application/base/Base.java index 7cf0a30..937e76c 100644 --- a/application/p_base/src/main/java/com/eastwood/demo/application/base/Base.java +++ b/application/p_base/src/main/java/com/eastwood/demo/application/base/Base.java @@ -1,5 +1,7 @@ package com.eastwood.demo.application.base; +import com.eastwood.demo.application.R; + /** * @author eastwood * createDate: 2018-05-29 diff --git a/application/p_common/src/main/java/com/eastwood/demo/application/common/Common.java b/application/p_common/src/main/java/com/eastwood/demo/application/common/Common.java index babc822..db55e08 100644 --- a/application/p_common/src/main/java/com/eastwood/demo/application/common/Common.java +++ b/application/p_common/src/main/java/com/eastwood/demo/application/common/Common.java @@ -1,5 +1,7 @@ package com.eastwood.demo.application.common; +import com.eastwood.demo.application.R; + /** * @author eastwood * createDate: 2018-11-26 diff --git a/application/p_home/src/main/java/com/eastwood/demo/application/home/Home.java b/application/p_home/src/main/java/com/eastwood/demo/application/home/Home.java index 8b80e70..c198f64 100644 --- a/application/p_home/src/main/java/com/eastwood/demo/application/home/Home.java +++ b/application/p_home/src/main/java/com/eastwood/demo/application/home/Home.java @@ -1,5 +1,7 @@ package com.eastwood.demo.application.home; +import com.eastwood.demo.application.R; + /** * @author eastwood * createDate: 2018-11-26 diff --git a/build.gradle b/build.gradle index 51b2ff4..fa1eea0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,15 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.0' + ext.kotlin_version = '1.3.61' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.eastwood.tools.plugins:micro-module:1.3.0' + classpath 'com.eastwood.tools.plugins:micro-module:1.4.0' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ce005fe..85dd5ba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Jan 15 22:21:09 CST 2019 +#Wed Jun 17 11:54:04 CST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/kotlin/build.gradle b/kotlin/build.gradle index 7d2bbdf..cd3b8bf 100644 --- a/kotlin/build.gradle +++ b/kotlin/build.gradle @@ -2,7 +2,6 @@ apply plugin: 'micro-module' apply plugin: 'com.android.library' apply plugin: 'kotlin-android' - apply plugin: 'kotlin-android-extensions' android { @@ -23,8 +22,15 @@ android { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } + + preview { + + } } + androidExtensions { + experimental = true + } } microModule { diff --git a/kotlin/main/build.gradle b/kotlin/main/build.gradle index 4976a15..bade2d6 100644 --- a/kotlin/main/build.gradle +++ b/kotlin/main/build.gradle @@ -1,19 +1,6 @@ // MicroModule build file where you can add configuration options to publish MicroModule(aar) to Maven // and declare MicroModule dependencies. -microModule { - mavenArtifact { - groupId 'com.eastwood.demo' - artifactId 'kotlin-main' - version '1.0.0-SNAPSHOT' - - repository { - url "***" - authentication(userName: '***', password: '***') - } - } -} - dependencies { implementation fileTree(dir: 'main/libs', include: ['*.jar']) // implementation microModule(':p_common') diff --git a/kotlin/main/src/main/java/com/eastwood/demo/kotlin/Test.kt b/kotlin/main/src/main/java/com/eastwood/demo/kotlin/Test.kt index 507f8d7..27aeeea 100644 --- a/kotlin/main/src/main/java/com/eastwood/demo/kotlin/Test.kt +++ b/kotlin/main/src/main/java/com/eastwood/demo/kotlin/Test.kt @@ -9,7 +9,7 @@ class Test { fun test() { // can't use [R.string.kotlin_common] which from microModule ':p_common'. - var i = R.string.kotlin_common +// var i = R.string.kotlin_common } } \ No newline at end of file diff --git a/kotlin/main/src/main/kotlin/com/eastwood/demo/kotlin/Test1.kt b/kotlin/main/src/main/kotlin/com/eastwood/demo/kotlin/Test1.kt index 6490979..5b8cec8 100644 --- a/kotlin/main/src/main/kotlin/com/eastwood/demo/kotlin/Test1.kt +++ b/kotlin/main/src/main/kotlin/com/eastwood/demo/kotlin/Test1.kt @@ -9,7 +9,7 @@ class Test1 { fun test() { // can't use [R.string.kotlin_common] which from microModule ':p_common'. - var i = R.string.kotlin_common +// var i = R.string.kotlin_common } } \ No newline at end of file diff --git a/kotlin/p_common/build.gradle b/kotlin/p_common/build.gradle index 32679d4..dd5852c 100644 --- a/kotlin/p_common/build.gradle +++ b/kotlin/p_common/build.gradle @@ -1,22 +1,6 @@ // MicroModule build file where you can add configuration options to publish MicroModule(aar) to Maven // and declare MicroModule dependencies. -microModule { - - useMavenArtifact false - - mavenArtifact { - groupId 'com.eastwood.demo' - artifactId 'kotlin-p_common' - version '1.0.0-SNAPSHOT' - - repository { - url "***" - authentication(userName: '***', password: '***') - } - } -} - dependencies { implementation fileTree(dir: 'p_common/libs', include: ['*.jar']) } diff --git a/kotlin/p_common/src/main/java/com/eastwood/demo/kotlin/common/Common.kt b/kotlin/p_common/src/main/java/com/eastwood/demo/kotlin/common/Common.kt index 4b20a8b..6ecf4a1 100644 --- a/kotlin/p_common/src/main/java/com/eastwood/demo/kotlin/common/Common.kt +++ b/kotlin/p_common/src/main/java/com/eastwood/demo/kotlin/common/Common.kt @@ -1,5 +1,7 @@ package com.eastwood.demo.kotlin.common +import com.eastwood.demo.kotlin.R + /** * * @author eastwood @@ -8,6 +10,7 @@ package com.eastwood.demo.kotlin.common class Common { fun test() { + var i = R.string.kotlin_common } diff --git a/kotlin/p_common/src/main/kotlin/com/eastwood/demo/kotlin/common/Common1.kt b/kotlin/p_common/src/main/kotlin/com/eastwood/demo/kotlin/common/Common1.kt index 29940e4..d44519b 100644 --- a/kotlin/p_common/src/main/kotlin/com/eastwood/demo/kotlin/common/Common1.kt +++ b/kotlin/p_common/src/main/kotlin/com/eastwood/demo/kotlin/common/Common1.kt @@ -1,5 +1,7 @@ package com.eastwood.demo.kotlin.common +import com.eastwood.demo.kotlin.R + /** * * @author eastwood diff --git a/library/main/build.gradle b/library/main/build.gradle index c490f67..39c415e 100644 --- a/library/main/build.gradle +++ b/library/main/build.gradle @@ -1,19 +1,3 @@ -microModule { - - useMavenArtifact false - - mavenArtifact { - groupId 'com.eastwood.demo' - artifactId 'library-main' - version '1.0.0-SNAPSHOT' - - repository { - url "***" - authentication(userName: '***', password: '***') - } - } - -} dependencies { implementation microModule(':p_common') diff --git a/library/p_base/build.gradle b/library/p_base/build.gradle index a5e7e78..5fbab79 100644 --- a/library/p_base/build.gradle +++ b/library/p_base/build.gradle @@ -1,18 +1,3 @@ -microModule { - - useMavenArtifact false - - mavenArtifact { - groupId 'com.eastwood.demo' - artifactId 'library-p_base' - version '1.0.0-SNAPSHOT' - - repository { - url "***" - authentication(userName: '***', password: '***') - } - } -} dependencies { diff --git a/library/p_base/src/main/java/com/eastwood/demo/library/base/Base.java b/library/p_base/src/main/java/com/eastwood/demo/library/base/Base.java index 0436123..f6d973e 100644 --- a/library/p_base/src/main/java/com/eastwood/demo/library/base/Base.java +++ b/library/p_base/src/main/java/com/eastwood/demo/library/base/Base.java @@ -1,5 +1,7 @@ package com.eastwood.demo.library.base; +import com.eastwood.demo.library.R; + /** * @author eastwood * createDate: 2018-11-09 diff --git a/library/p_common/build.gradle b/library/p_common/build.gradle index 262747f..e9f1107 100644 --- a/library/p_common/build.gradle +++ b/library/p_common/build.gradle @@ -1,18 +1,3 @@ -microModule { - - useMavenArtifact false - - mavenArtifact { - groupId 'com.eastwood.demo' - artifactId 'library-p_common' - version '1.0.0-SNAPSHOT' - - repository { - url "***" - authentication(userName: '***', password: '***') - } - } -} dependencies { implementation microModule(':p_base') diff --git a/library/p_common/src/main/java/com/eastwood/demo/library/common/Common.java b/library/p_common/src/main/java/com/eastwood/demo/library/common/Common.java index d3409e4..a62be15 100644 --- a/library/p_common/src/main/java/com/eastwood/demo/library/common/Common.java +++ b/library/p_common/src/main/java/com/eastwood/demo/library/common/Common.java @@ -1,5 +1,7 @@ package com.eastwood.demo.library.common; +import com.eastwood.demo.library.R; + /** * @author eastwood * createDate: 2018-11-09 diff --git a/library/p_utils/build.gradle b/library/p_utils/build.gradle index b3a0653..5fbab79 100644 --- a/library/p_utils/build.gradle +++ b/library/p_utils/build.gradle @@ -1,18 +1,3 @@ -microModule { - - useMavenArtifact false - - mavenArtifact { - groupId 'com.eastwood.demo' - artifactId 'library-p_util' - version '1.0.0-SNAPSHOT' - - repository { - url "***" - authentication(userName: '***', password: '***') - } - } -} dependencies { diff --git a/library/p_utils/src/main/java/com/eastwood/demo/library/utils/Utils.java b/library/p_utils/src/main/java/com/eastwood/demo/library/utils/Utils.java index 56d3a0e..04cf3ab 100644 --- a/library/p_utils/src/main/java/com/eastwood/demo/library/utils/Utils.java +++ b/library/p_utils/src/main/java/com/eastwood/demo/library/utils/Utils.java @@ -1,5 +1,7 @@ package com.eastwood.demo.library.utils; +import com.eastwood.demo.library.R; + /** * @author eastwood * createDate: 2018-05-29 diff --git a/micro-module/build.gradle b/micro-module/build.gradle index 473a93f..48668a4 100644 --- a/micro-module/build.gradle +++ b/micro-module/build.gradle @@ -19,7 +19,7 @@ apply plugin: 'maven' def groupId = 'com.eastwood.tools.plugins' def artifactId = 'micro-module' -def version = '1.3.2' +def version = '1.4.0' def localReleaseDest = "${buildDir}/release/${version}" diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/GenerateMicroModuleRFileTask.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/GenerateMicroModuleRFileTask.groovy deleted file mode 100644 index a162f17..0000000 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/GenerateMicroModuleRFileTask.groovy +++ /dev/null @@ -1,264 +0,0 @@ -package com.eastwood.tools.plugins - -import com.android.build.gradle.api.BaseVariant -import com.eastwood.tools.plugins.core.MicroModule -import com.eastwood.tools.plugins.core.MicroModuleInfo -import com.eastwood.tools.plugins.core.Utils -import org.gradle.api.DefaultTask -import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.tasks.TaskAction -import org.objectweb.asm.* - -import java.util.jar.JarEntry -import java.util.jar.JarFile -import java.util.jar.JarOutputStream -import java.util.zip.ZipEntry - -class GenerateMicroModuleRFileTask extends DefaultTask { - - public final static List SUPPORT_RESOURCE_TYPE = ["anim", "array", "attr", "bool", "color", "dimen", "mipmap", - "drawable", "id", "integer", "layout", "menu", "plurals", "string", "style", "styleable"] - - String packageName - File outputDir - MicroModuleInfo microModuleInfo - - boolean appliedKotlinPlugin - BaseVariant variant - boolean generatedMicroModuleRClass - - @TaskAction - def run() { - generatedMicroModuleRClass = true - if (appliedKotlinPlugin) { - File symbolFile = getSymbolFile(getProject(), variant) - if (symbolFile.exists()) { - List resourceTypeList = getResourceTypeList(symbolFile) - generateVariantMicroModuleRClass(getProject(), microModuleInfo, packageName, outputDir, true, resourceTypeList) - } else { - generateVariantMicroModuleRClass(getProject(), microModuleInfo, packageName, outputDir, true, SUPPORT_RESOURCE_TYPE) - } - } else { - generateVariantMicroModuleRClass(getProject(), microModuleInfo, packageName, outputDir, false, null) - } - } - - void revertMicroModuleRClass() { - generateVariantMicroModuleRClass(getProject(), microModuleInfo, packageName, outputDir, true, SUPPORT_RESOURCE_TYPE) - } - - private static File getSymbolFile(Project project, BaseVariant variant) { - File symbolFile = null - def task = getVariantGenerateRFileTask(project, variant) - if (task != null) { - task.outputs.files.each { - if (it.absolutePath.endsWith("R.txt")) { - symbolFile = it - } - } - } - return symbolFile - } - - private static Task getVariantGenerateRFileTask(Project project, BaseVariant variant) { - def taskName = "process${variant.name.capitalize()}Resources" - def task = project.tasks.findByName(taskName) - if (task == null) { - taskName = "generate${variant.name.capitalize()}RFile" - task = project.tasks.findByName(taskName) - } - return task - } - - private static List getResourceTypeList(File symbolFile) { - List resourceTypeList = new ArrayList<>() - String currentType = null - String resourceTypeTemp - symbolFile.readLines().each { - resourceTypeTemp = it.split(" ")[1] - if (resourceTypeTemp != currentType) { - currentType = resourceTypeTemp - resourceTypeList.add(currentType) - } - } - return resourceTypeList - } - - private static void generateVariantMicroModuleRClass(Project project, MicroModuleInfo microModuleInfo, String packageName, File outputDir, boolean appliedKotlinPlugin, List resourceType) { - def packageNames = [] - microModuleInfo.includeMicroModules.each { - MicroModule microModule = it.value - def microManifestFile = new File(microModule.microModuleDir, MicroModulePlugin.MAIN_MANIFEST_PATH) - if (!microManifestFile.exists()) { - return - } - def microModulePackageName = Utils.getAndroidManifestPackageName(microManifestFile) - if (microModulePackageName == null || packageNames.contains(microModulePackageName) || microModulePackageName == packageName) { - return - } - - packageNames << microModulePackageName - def RPath = outputDir.canonicalPath + "/" + microModulePackageName.replace(".", "/") - File RFile = project.file(RPath + "/R.java") - project.file(RPath).mkdirs() - - if (appliedKotlinPlugin) { - def RJava = "package " + microModulePackageName + ";\n\n/** This class is generated by micro-module plugin, DO NOT MODIFY. */\npublic class R extends " + packageName + ".R {\n\n"; - resourceType.each { - RJava += " public static class $it extends $packageName" + ".R." + "$it {}\n" - } - RJava += "\n}" - RFile.setText(RJava) - } else { - RFile.setText("package " + microModulePackageName + ";\n\n/** This class is generated by micro-module plugin, DO NOT MODIFY. */\npublic class R extends " + packageName + ".R {\n\n}") - } - } - } - - static void modifyModuleRFile(Project project, BaseVariant variant, String packageName, MicroModuleInfo microModuleInfo, File outputDir, boolean appliedKotlinPlugin) { - def task = getVariantGenerateRFileTask(project, variant) - if (task == null) return - - task.doLast { - File RFile = null - task.outputs.files.each { - if (it.isDirectory()) { - def RJava = new File(it, packageName.replace(".", "/") + "/R.java") - if (RJava.exists()) { - RFile = RJava - } - } else if (it.name == "R.jar") { - RFile = it - } - } - - if (RFile == null) { - throw new RuntimeException("Can not find R file.") - } - - modifyRFileAccess(RFile, packageName, appliedKotlinPlugin) - - if (appliedKotlinPlugin) { - File symbolFile = getSymbolFile(project, variant) - if (symbolFile.exists()) { - List resourceTypeList = getResourceTypeList(symbolFile) - generateVariantMicroModuleRClass(project, microModuleInfo, packageName, outputDir, true, resourceTypeList) - } - } - } - } - - private static void modifyRFileAccess(File RFile, String packageName, boolean appliedKotlinPlugin) { - if (RFile.name.endsWith('.java')) { - modifyRJavaAccess(RFile, appliedKotlinPlugin) - } else { - modifyRClassAccess(RFile, packageName) - } - } - - private static void modifyRJavaAccess(File RFile, boolean appliedKotlinPlugin) { - if (appliedKotlinPlugin) { - Map resourceType = new HashMap<>() - def newR = RFile.text.replace(" final class ", " class ").replace("private R() {}", "") - def resourcesPattern = /static class ([a-z]+) \{/ - def matcher = (newR =~ resourcesPattern) - while (matcher.find()) { - resourceType.put(matcher.group(1), null) - } - resourceType.keySet().each { - newR = newR.replace("private $it() {}", "") - } - RFile.write(newR) - } else { - def newR = RFile.text.replace("public final class R", "public class R").replace("private R() {}", "") - RFile.write(newR) - } - } - - private static void modifyRClassAccess(File RFile, String packageName) { - String targetRClass = packageName.replace(".", "/") + "/R" - Map tempModifiedClassByteMap = new HashMap() - JarFile jarFile = new JarFile(RFile) - Enumeration jarEntryEnumeration = jarFile.entries() - while (jarEntryEnumeration.hasMoreElements()) { - JarEntry jarEntry = jarEntryEnumeration.nextElement() - String filename = jarEntry.getName() - if (!filename.startsWith(targetRClass)) { - continue - } - - InputStream inputStream = jarFile.getInputStream(jarEntry) - if (inputStream != null) { - byte[] bytes = modifyRClassAccess(inputStream.bytes) - if (bytes != null) { - tempModifiedClassByteMap.put(filename, bytes) - } - } - inputStream.close() - } - - if (tempModifiedClassByteMap.size() != 0) { - File tempJar = new File(RFile.absolutePath.replace('.jar', 'temp.jar')) - if (tempJar.exists()) - tempJar.delete() - - jarEntryEnumeration = jarFile.entries() - JarOutputStream jarOutputStream = new JarOutputStream(new FileOutputStream(tempJar)) - while (jarEntryEnumeration.hasMoreElements()) { - JarEntry jarEntry = jarEntryEnumeration.nextElement() - String filename = jarEntry.getName() - ZipEntry zipEntry = new ZipEntry(filename) - jarOutputStream.putNextEntry(zipEntry) - if (tempModifiedClassByteMap.containsKey(filename)) { - jarOutputStream.write(tempModifiedClassByteMap.get(filename)) - } else { - InputStream inputStream = jarFile.getInputStream(jarEntry) - jarOutputStream.write(inputStream.bytes) - inputStream.close() - } - jarOutputStream.closeEntry() - } - jarOutputStream.close() - jarFile.close() - - FileOutputStream outputStream = new FileOutputStream(RFile) - outputStream.write(tempJar.bytes) - outputStream.close() - tempJar.delete() - } else { - jarFile.close() - } - } - - private static byte[] modifyRClassAccess(byte[] bytes) { - ClassWriter classWriter = new ClassWriter(0) - RClassAdapter targetClassAdapter = new RClassAdapter(Opcodes.ASM5, classWriter) - ClassReader classReader = new ClassReader(bytes) - classReader.accept(targetClassAdapter, 0) - return classWriter.toByteArray() - } - - private static class RClassAdapter extends ClassVisitor { - - RClassAdapter(int api, ClassVisitor cv) { - super(api, cv) - } - - @Override - void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - super.visit(version, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, name, signature, superName, interfaces) - } - - @Override - MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - return super.visitMethod(Opcodes.ACC_PUBLIC, name, desc, signature, exceptions) - } - - @Override - void visitInnerClass(String name, String outerName, String innerName, int access) { - super.visitInnerClass(name, outerName, innerName, Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC) - } - } - -} diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/MicroModulePlugin.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/MicroModulePlugin.groovy index d5c2421..5e94f2b 100644 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/MicroModulePlugin.groovy +++ b/micro-module/src/main/groovy/com/eastwood/tools/plugins/MicroModulePlugin.groovy @@ -24,18 +24,11 @@ import org.gradle.api.tasks.compile.JavaCompile class MicroModulePlugin implements Plugin { - public final static String MAIN_MANIFEST_PATH = '/src/main/AndroidManifest.xml' - - private final static String UPLOAD_AAR_TASK_PREFIX = 'uploadMicroModule' - private final static String EXCLUDE_BUILD_CONFIG = '**/BuildConfig.java' - private final static String NORMAL = 'normal' - private final static String UPLOAD_AAR = 'upload_aar' private final static String ASSEMBLE_OR_GENERATE = 'assemble_or_generate' private final static String APPLY_NORMAL_MICRO_MODULE_SCRIPT = 'apply_normal_micro_module_script' private final static String APPLY_INCLUDE_MICRO_MODULE_SCRIPT = 'apply_include_micro_module_script' - private final static String APPLY_UPLOAD_MICRO_MODULE_SCRIPT = 'apply_upload_micro_module_script' private final static String APPLY_EXPORT_MICRO_MODULE_SCRIPT = 'apply_export_micro_module_script' private final static BuildListener buildListener = new BuildListener() { @@ -75,7 +68,7 @@ class MicroModulePlugin implements Plugin { microModuleInfo += ' \n' microModulePlugin.microModuleInfo.includeMicroModules.each { MicroModule microModule = it.value - microModuleInfo += ' \n' + microModuleInfo += ' \n' } microModuleInfo += ' \n' } @@ -89,8 +82,6 @@ class MicroModulePlugin implements Plugin { Project project String startTaskState = NORMAL - boolean executeUploadTask - String uploadMicroModuleName MicroModuleInfo microModuleInfo ProductFlavorInfo productFlavorInfo @@ -100,6 +91,8 @@ class MicroModulePlugin implements Plugin { boolean appliedLibraryPlugin + boolean clearedOriginSourceSets + void apply(Project project) { this.project = project this.microModuleInfo = new MicroModuleInfo(project) @@ -110,19 +103,7 @@ class MicroModulePlugin implements Plugin { if (project.gradle.getStartParameter().taskNames.size() == 0) { startTaskState = NORMAL } else { - project.gradle.getStartParameter().taskNames.each { - if (it.startsWith(UPLOAD_AAR_TASK_PREFIX)) { - startTaskState = UPLOAD_AAR - uploadMicroModuleName = ':' + it.substring(it.indexOf('[') + 1, it.lastIndexOf(']')) - } - } - if (startTaskState != UPLOAD_AAR) { - startTaskState = ASSEMBLE_OR_GENERATE - } - } - - if (startTaskState == UPLOAD_AAR) { - executeUploadTask = project.gradle.getStartParameter().getProjectDir() == project.getProjectDir() + startTaskState = ASSEMBLE_OR_GENERATE } if (startTaskState != NORMAL) { @@ -132,8 +113,7 @@ class MicroModulePlugin implements Plugin { if (applyScriptState == APPLY_INCLUDE_MICRO_MODULE_SCRIPT) { configuration.dependencies.remove(it) return - } else if (applyScriptState == APPLY_UPLOAD_MICRO_MODULE_SCRIPT - || applyScriptState == APPLY_NORMAL_MICRO_MODULE_SCRIPT + } else if (applyScriptState == APPLY_NORMAL_MICRO_MODULE_SCRIPT || applyScriptState == APPLY_EXPORT_MICRO_MODULE_SCRIPT) { return } else if (currentMicroModule == null && startTaskState == ASSEMBLE_OR_GENERATE) { @@ -152,19 +132,23 @@ class MicroModulePlugin implements Plugin { @Override void addIncludeMicroModule(MicroModule microModule, boolean mainMicroModule) { - if (startTaskState == UPLOAD_AAR) { - if (microModule.name == uploadMicroModuleName) { - microModuleInfo.setMainMicroModule(microModule) - } else { - microModuleInfo.addIncludeMicroModule(microModule) - } + if (mainMicroModule) { + microModuleInfo.setMainMicroModule(microModule) } else { - if (mainMicroModule) { - microModuleInfo.setMainMicroModule(microModule) - } else { - microModuleInfo.addIncludeMicroModule(microModule) + microModuleInfo.addIncludeMicroModule(microModule) + } + + if(!clearedOriginSourceSets) { + productFlavorInfo = new ProductFlavorInfo(project) + clearedOriginSourceSets = true + clearOriginSourceSet() + + if(microModuleInfo.mainMicroModule != null) { + addMicroModuleSourceSet(microModuleInfo.mainMicroModule) } } + + addMicroModuleSourceSet(microModule) } @Override @@ -189,30 +173,10 @@ class MicroModulePlugin implements Plugin { MicroModule microModule = microModuleInfo.getMicroModule(path) def result = [] - if (startTaskState == UPLOAD_AAR) { - if (microModule.useMavenArtifact) { - result = microModule.mavenArtifact.groupId + ':' + microModule.mavenArtifact.artifactId + ':' + microModule.mavenArtifact.version - } else { - throw new GradleException("make sure the MicroModule '" + path + "' has been uploaded to Maven and add 'microModule { useMavenArtifact true }' to its build.gradle. " + - "\nif not, add follow config to its build.gradle and upload :\n\nmicroModule {\n" + - "\n" + " useMavenArtifact true\n" + "\n" + " mavenArtifact {\n" + " groupId ...\n" + " artifactId ...\n" + - " version ...\n" + " }\n" + "\n" + " mavenRepository {\n" + " url ...\n" + - " authentication(userName: ..., password: ...)\n" + " }\n" + "\n" + - "}\n\n* Get more help at https://github.com/EastWoodYang/MicroModule") - } - } else if (startTaskState == ASSEMBLE_OR_GENERATE) { - if (microModule.useMavenArtifact) { - checkMicroModuleMavenArtifact(microModule.name) - - if (!microModule.addDependency) { - MavenArtifact mavenArtifact = microModule.mavenArtifact - result = mavenArtifact.groupId + ':' + mavenArtifact.artifactId + ':' + mavenArtifact.version - } - } else { - addMicroModuleSourceSet(microModule) - applyMicroModuleScript(microModule) - microModule.appliedScript = true - } + if (startTaskState == ASSEMBLE_OR_GENERATE) { + addMicroModuleSourceSet(microModule) + applyMicroModuleScript(microModule) + microModule.appliedScript = true } return result } @@ -240,8 +204,6 @@ class MicroModulePlugin implements Plugin { baseVariants = libraryExtension.libraryVariants isLibrary = true } - def microManifestFile = new File(microModuleInfo.mainMicroModule.microModuleDir, MAIN_MANIFEST_PATH) - def mainPackageName = Utils.getAndroidManifestPackageName(microManifestFile) baseVariants.all { BaseVariant variant -> if (microModuleExtension.codeCheckEnabled) { @@ -260,59 +222,6 @@ class MicroModulePlugin implements Plugin { checkMicroModuleBoundary(taskNamePrefix, variant.buildType.name, null, sourceFolders) } } - - if (startTaskState == UPLOAD_AAR) { - return - } - - boolean appliedKotlinPlugin = project.pluginManager.hasPlugin('kotlin-android') - File outputDir = new File(project.buildDir, "generated/source/microModule/${variant.dirName}") - GenerateMicroModuleRFileTask.modifyModuleRFile(project, variant, mainPackageName, microModuleInfo, outputDir, appliedKotlinPlugin) - - variant.outputs.all { BaseVariantOutput output -> - String generateMicroModuleRFileTaskName = "generate${variant.name.capitalize()}MicroModuleRFile" - GenerateMicroModuleRFileTask task = project.tasks.findByName(generateMicroModuleRFileTaskName) - if (task != null) return - - task = project.tasks.create("generate${variant.name.capitalize()}MicroModuleRFile", GenerateMicroModuleRFileTask) - task.packageName = mainPackageName - task.microModuleInfo = microModuleInfo - task.outputDir = outputDir - task.appliedKotlinPlugin = appliedKotlinPlugin - task.variant = variant - variant.registerJavaGeneratingTask(task, outputDir) - - if (appliedKotlinPlugin) { - project.gradle.addBuildListener(new BuildListener() { - @Override - void buildStarted(Gradle gradle) { - - } - - @Override - void settingsEvaluated(Settings settings) { - - } - - @Override - void projectsLoaded(Gradle gradle) { - - } - - @Override - void projectsEvaluated(Gradle gradle) { - - } - - @Override - void buildFinished(BuildResult buildResult) { - if (task.generatedMicroModuleRClass) { - task.revertMicroModuleRClass() - } - } - }) - } - } } } }) @@ -324,30 +233,16 @@ class MicroModulePlugin implements Plugin { throw new GradleException("the main MicroModule could not be found in ${project.getDisplayName()}.") } - if (startTaskState == UPLOAD_AAR && !executeUploadTask) return - appliedLibraryPlugin = project.pluginManager.hasPlugin('com.android.library') productFlavorInfo = new ProductFlavorInfo(project) - microModuleExtension.onMavenArtifactListener = new OnMavenArtifactListener() { - @Override - void onUseMavenArtifactChanged(boolean value) { - currentMicroModule.useMavenArtifact = value - } - - @Override - void onMavenArtifactChanged(MavenArtifact artifact) { - currentMicroModule.mavenArtifact = artifact - } - } applyScriptState = APPLY_INCLUDE_MICRO_MODULE_SCRIPT microModuleInfo.includeMicroModules.each { MicroModule microModule = it.value microModuleInfo.dependencyGraph.add(microModule.name) applyMicroModuleScript(microModule) } - microModuleExtension.onMavenArtifactListener = null clearOriginSourceSet() if (startTaskState == ASSEMBLE_OR_GENERATE) { @@ -366,44 +261,22 @@ class MicroModulePlugin implements Plugin { hasExportMainMicroModule = true } - if (microModule.useMavenArtifact) { - checkMicroModuleMavenArtifact(it) - if (microModule.addDependency) return - - MavenArtifact mavenArtifact = microModule.mavenArtifact - project.dependencies.add('api', mavenArtifact.groupId + ':' + mavenArtifact.artifactId + ':' + mavenArtifact.version) - microModule.addDependency = true - } else { - if (microModule.appliedScript) return + if (microModule.appliedScript) return - addMicroModuleSourceSet(microModule) - applyMicroModuleScript(microModule) - microModule.appliedScript = true - } + addMicroModuleSourceSet(microModule) + applyMicroModuleScript(microModule) + microModule.appliedScript = true } } if (!hasExportMainMicroModule) { throw new GradleException("the main MicroModule '${microModuleInfo.mainMicroModule.name}' is not in the export list.") } - } else if (startTaskState == UPLOAD_AAR) { - applyScriptState = APPLY_UPLOAD_MICRO_MODULE_SCRIPT - MicroModule mainMicroModule = microModuleInfo.mainMicroModule - checkMicroModuleMavenArtifact(mainMicroModule.name) - - addMicroModuleSourceSet(mainMicroModule) - createUploadMicroModuleAarTask(mainMicroModule) - applyMicroModuleScript(mainMicroModule) - - if (microModuleInfo.mainMicroModule.useMavenArtifact) { - excludeBuildConfigFile() - } } else { applyScriptState = APPLY_NORMAL_MICRO_MODULE_SCRIPT microModuleInfo.includeMicroModules.each { MicroModule microModule = it.value addMicroModuleSourceSet(microModule) - createUploadMicroModuleAarTask(microModule) applyMicroModuleScript(microModule) } } @@ -413,9 +286,7 @@ class MicroModulePlugin implements Plugin { project.tasks.preBuild.doFirst { clearOriginSourceSet() - if (startTaskState == UPLOAD_AAR) { - addMicroModuleSourceSet(microModuleInfo.mainMicroModule) - } else if (startTaskState == ASSEMBLE_OR_GENERATE) { + if (startTaskState == ASSEMBLE_OR_GENERATE) { microModuleInfo.includeMicroModules.each { MicroModule microModule = it.value if (microModule.appliedScript) { @@ -432,18 +303,6 @@ class MicroModulePlugin implements Plugin { } } - def checkMicroModuleMavenArtifact(String name) { - microModuleInfo.dependencyGraph.bfsDistance(name).each { - if (it.value == null || it.value == 0) return - - MicroModule childMicroModule = microModuleInfo.getMicroModule(it.key) - if (!childMicroModule.useMavenArtifact) { - throw new GradleException("MicroModule '${childMicroModule.name}' should use maven artifact.") - } - childMicroModule.addDependency = true - } - } - def generateAndroidManifest() { if ((startTaskState == ASSEMBLE_OR_GENERATE || !microModuleInfo.exportMicroModules.isEmpty()) && isMainSourceSetEmpty()) { setMainSourceSetManifest() @@ -513,15 +372,13 @@ class MicroModulePlugin implements Plugin { ManifestMerger2.Invoker invoker = new ManifestMerger2.Invoker(mainManifestFile, logger, mergeType, documentType) invoker.withFeatures(ManifestMerger2.Invoker.Feature.NO_PLACEHOLDER_REPLACEMENT) - if (startTaskState != UPLOAD_AAR) { - microModuleInfo.includeMicroModules.each { - MicroModule microModule = it.value - if (startTaskState == ASSEMBLE_OR_GENERATE && !microModule.appliedScript) return - if (microModule.name == microModuleInfo.mainMicroModule.name) return - def microManifestFile = new File(microModule.microModuleDir, "/src/${variantName}/AndroidManifest.xml") - if (microManifestFile.exists()) { - invoker.addLibraryManifest(microManifestFile) - } + microModuleInfo.includeMicroModules.each { + MicroModule microModule = it.value + if (startTaskState == ASSEMBLE_OR_GENERATE && !microModule.appliedScript) return + if (microModule.name == microModuleInfo.mainMicroModule.name) return + def microManifestFile = new File(microModule.microModuleDir, "/src/${variantName}/AndroidManifest.xml") + if (microManifestFile.exists()) { + invoker.addLibraryManifest(microManifestFile) } } @@ -726,64 +583,6 @@ class MicroModulePlugin implements Plugin { } } - def createUploadMicroModuleAarTask(MicroModule microModule) { - if (!appliedLibraryPlugin || microModule.mavenArtifact == null) return - - def taskName = UPLOAD_AAR_TASK_PREFIX + '[' + microModule.microModuleDir.name + ']aar' - UploadAarTask task = project.getTasks().create(taskName, UploadAarTask.class) - task.setMicroModule(microModule) - task.setGroup('upload') - - if (microModule.name == uploadMicroModuleName) { - project.pluginManager.apply('maven') - project.uploadArchives { - repositories { - mavenDeployer { - MavenArtifact mavenArtifact = microModule.mavenArtifact - MavenRepository mavenRepository = mavenArtifact.repository - repository(url: mavenRepository.url) { - if (mavenRepository.authentication != null) { - authentication(mavenRepository.authentication) - } - } - - pom.project { - groupId mavenArtifact.groupId - artifactId mavenArtifact.artifactId - version mavenArtifact.version - } - } - } - } - task.dependsOn('clean', 'uploadArchives') - } - } - - def excludeBuildConfigFile() { - project.gradle.taskGraph.whenReady { - BaseExtension extension = (BaseExtension) project.extensions.getByName('android') - extension.buildTypes.each { - def buildType = Utils.upperCase(it.name) - if (productFlavorInfo.combinedProductFlavors.size() == 0) { - def compileJavaTaskName = "compile${buildType}JavaWithJavac" - JavaCompile javaCompile = project.tasks.findByName(compileJavaTaskName) - if (javaCompile != null) { - javaCompile.exclude(EXCLUDE_BUILD_CONFIG) - } - } else { - productFlavorInfo.combinedProductFlavors.each { - def compileJavaTaskName = "compile${Utils.upperCase(it)}${buildType}JavaWithJavac" - JavaCompile javaCompile = project.tasks.findByName(compileJavaTaskName) - if (javaCompile != null) { - javaCompile.exclude(EXCLUDE_BUILD_CONFIG) - } - } - } - } - } - - } - def checkMicroModuleBoundary(String taskPrefix, String buildType, String flavorName, List sourceFolders) { CodeChecker codeChecker diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/UploadAarTask.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/UploadAarTask.groovy deleted file mode 100644 index 7d91b0c..0000000 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/UploadAarTask.groovy +++ /dev/null @@ -1,20 +0,0 @@ -package com.eastwood.tools.plugins - -import com.eastwood.tools.plugins.core.MicroModule -import com.eastwood.tools.plugins.core.extension.MavenArtifact -import com.eastwood.tools.plugins.core.extension.MavenRepository -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.TaskAction - -class UploadAarTask extends DefaultTask { - - MicroModule microModule - - @TaskAction - void upload() { - MavenArtifact mavenArtifact = microModule.mavenArtifact - MavenRepository mavenRepository = mavenArtifact.repository - getLogger().error("\nUpload artifact(" + mavenArtifact.groupId + ":" + mavenArtifact.artifactId + ":" + mavenArtifact.version + ") to repository(" + mavenRepository.url + ").") - } - -} \ No newline at end of file diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/MicroModule.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/MicroModule.groovy index 0872fa7..508a5d2 100644 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/MicroModule.groovy +++ b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/MicroModule.groovy @@ -1,16 +1,11 @@ package com.eastwood.tools.plugins.core -import com.eastwood.tools.plugins.core.extension.MavenArtifact class MicroModule { String name File microModuleDir - boolean useMavenArtifact - MavenArtifact mavenArtifact - boolean appliedScript - boolean addDependency } \ No newline at end of file diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/Utils.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/Utils.groovy index 3c2fc68..afb8217 100644 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/Utils.groovy +++ b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/Utils.groovy @@ -36,7 +36,11 @@ class Utils { } else { microModuleName = microModuleName.replaceAll("/", ":") } - if (!microModuleDir.exists()) { + // in windows and mac system, the file name is not case sensitive, micro-module name may not match file name but run correctly + // in linux system(as ci server), this case is wrong + // add this condition to find this error in windows + if (!microModuleDir.exists() || microModuleName != microModulePath) { + System.err.println("microModuleDir:" + microModuleDir.getAbsolutePath() + " not exit, or module name and file name case sensitivity wrong") return null } MicroModule microModule = new MicroModule() @@ -50,4 +54,4 @@ class Utils { } -} \ No newline at end of file +} diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/check/CodeChecker.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/check/CodeChecker.groovy index 02ded58..b07c65e 100644 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/check/CodeChecker.groovy +++ b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/check/CodeChecker.groovy @@ -224,8 +224,7 @@ class CodeChecker { from = resourcesMap.get(name) } else if (find.startsWith("import")) { name = find.substring(find.lastIndexOf(" ") + 1, find.length()) - if (name.endsWith('.R') || name.endsWith('.BuildConfig')) { - handleMicroModuleRAndBuildConfig(microModuleName, name, find, textLines, absolutePath) + if(name.endsWith('.R')) { continue } from = classesMap.get(name) @@ -307,43 +306,6 @@ class CodeChecker { return checkManifest.save(manifest) } - private void handleMicroModuleRAndBuildConfig(String microModuleName, String name, String find, List textLines, String absolutePath) { - String packageName = name.substring(0, name.lastIndexOf('.')) - List microModules = microModulePackageNameMap.get(packageName) - if (microModules == null || microModules.contains(name)) return - - boolean hasDependency - List withoutDependency = new ArrayList<>() - for (String from : microModules) { - hasDependency = microModuleInfo.hasDependency(microModuleName, from) - if (hasDependency) { - break - } - withoutDependency.add(from) - } - - if (hasDependency) { - return - } - - List lines = textLines.findIndexValues { it.contains(find) } - lines.each { - def lineIndex = it.intValue() - def lineContext = textLines.get(lineIndex).trim() - if (lineContext.startsWith("//") || lineContext.startsWith("/*")) { - return - } - - def message = absolutePath + ':' + (lineIndex + 1) - if (!errorMessage.contains(message)) { - message += lineSeparator - message += "- cannot use [" + find + "] which from MicroModule '${withoutDependency.get(0)}'." - message += lineSeparator - errorMessage += message - } - } - } - private String initMicroModulePackageName() { microModulePackageNameMap = new HashMap<>() microModuleInfo.includeMicroModules.each { diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/DefaultMicroModuleExtension.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/DefaultMicroModuleExtension.groovy index 5d8c1cb..d2ea1b0 100644 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/DefaultMicroModuleExtension.groovy +++ b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/DefaultMicroModuleExtension.groovy @@ -4,13 +4,11 @@ import com.eastwood.tools.plugins.core.MicroModule import com.eastwood.tools.plugins.core.Utils import org.gradle.api.GradleException import org.gradle.api.Project -import org.gradle.util.ConfigureUtil class DefaultMicroModuleExtension implements MicroModuleExtension { Project project OnMicroModuleListener onMicroModuleListener - OnMavenArtifactListener onMavenArtifactListener boolean codeCheckEnabled = true @@ -55,20 +53,4 @@ class DefaultMicroModuleExtension implements MicroModuleExtension { onMicroModuleListener.addIncludeMicroModule(microModule, true) } - @Override - void useMavenArtifact(boolean value) { - if(onMavenArtifactListener == null) return - - onMavenArtifactListener.onUseMavenArtifactChanged(value) - } - - @Override - void mavenArtifact(Closure closure) { - if(onMavenArtifactListener == null) return - - MavenArtifact mavenArtifact = new MavenArtifact() - ConfigureUtil.configure(closure, mavenArtifact) - onMavenArtifactListener.onMavenArtifactChanged(mavenArtifact) - } - } diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/MavenArtifact.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/MavenArtifact.groovy deleted file mode 100644 index 9790e4b..0000000 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/MavenArtifact.groovy +++ /dev/null @@ -1,30 +0,0 @@ -package com.eastwood.tools.plugins.core.extension - -import org.gradle.util.ConfigureUtil - -class MavenArtifact { - - String groupId - String artifactId - String version - - MavenRepository repository - - void groupId(String groupId) { - this.groupId = groupId - } - - void artifactId(String artifactId) { - this.artifactId = artifactId - } - - void version(String version) { - this.version = version - } - - void repository(Closure closure) { - repository = new MavenRepository() - ConfigureUtil.configure(closure, repository) - } - -} \ No newline at end of file diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/MavenRepository.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/MavenRepository.groovy deleted file mode 100644 index 053a6b5..0000000 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/MavenRepository.groovy +++ /dev/null @@ -1,16 +0,0 @@ -package com.eastwood.tools.plugins.core.extension - -class MavenRepository { - - String url - Object authentication - - void url(String url) { - this.url = url - } - - void authentication(Object values) { - this.authentication = values - } - -} \ No newline at end of file diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/MicroModuleExtension.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/MicroModuleExtension.groovy index db7bdf8..1ed7bb5 100644 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/MicroModuleExtension.groovy +++ b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/MicroModuleExtension.groovy @@ -10,8 +10,4 @@ interface MicroModuleExtension { void include(String... microModulePaths) - void useMavenArtifact(boolean value) - - void mavenArtifact(Closure closure) - } diff --git a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/OnMavenArtifactListener.groovy b/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/OnMavenArtifactListener.groovy deleted file mode 100644 index 98f6324..0000000 --- a/micro-module/src/main/groovy/com/eastwood/tools/plugins/core/extension/OnMavenArtifactListener.groovy +++ /dev/null @@ -1,9 +0,0 @@ -package com.eastwood.tools.plugins.core.extension - -interface OnMavenArtifactListener { - - void onUseMavenArtifactChanged(boolean value) - - void onMavenArtifactChanged(MavenArtifact artifact) - -} diff --git a/picture/1.png b/picture/1.png index 28ea4ee..e3fedbc 100644 Binary files a/picture/1.png and b/picture/1.png differ diff --git a/picture/2.png b/picture/2.png deleted file mode 100644 index 75fa8cd..0000000 Binary files a/picture/2.png and /dev/null differ diff --git a/settings.gradle b/settings.gradle index d1e797b..4705f95 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,5 @@ include ':application', ':library', ':kotlin' -if(file('micro-module').exists()) { - includeBuild 'micro-module' -} \ No newline at end of file +//if(file('micro-module').exists()) { +// includeBuild 'micro-module' +//} \ No newline at end of file