# 迁移背景

历史工程中的发布脚本存在以下问题：
- 不支持多个组件同时发布。只能选取一个组件，然后并行发布其依赖的组件，而不能一起发布没有关联的两个组件。
- 不支持纯Java模块，假定了所有模块都是Android Library模块。

# 准备工作

1. 最新的 IDE 插件 （3.x 版本及以上）
1. 确保基线版本为2.4.5或者更高版本 （对应alchemy/base_config.json中larkIntegrationVersion的版本号至少为0.0.1-rc30）

# 迁移对象

使用旧版本基线（2.4.4及之前版本）创建的工程。
也可以从其他角度判断：
1. alchemy/gradles/publish.gradle 文件代码行数超过了500行的就是历史工程。
1. 使用本地构建功能时，出现了找不到`alchemyPublish`这个gradle Task的报错。

# 修改内容

alchemy/gradles/publish.gradle 内容替换为：

```javascript 
String ANDROID_LIBRARY_PLUGIN = "com.android.library"
String JAVA_PLUGIN = "java"
def applyLarkComponentPublishPlugin() {
    apply plugin: "lark.component.publish"
}
pluginManager.withPlugin(ANDROID_LIBRARY_PLUGIN) {
applyLarkComponentPublishPlugin()
}
pluginManager.withPlugin(JAVA_PLUGIN) {
applyLarkComponentPublishPlugin()
}
// 仅供兼容
/**
 * 原生集成依赖配置
 */
class AlchemyComponentExtension {
    /** 组件模块类型，默认0为开放协议实现模块、1为源码依赖AndroidLibrary、2为本地AAR依赖；其中1、2将会执行关联依赖发布 */
    Integer componentModuleType = -1
    /** 组件名称，需保持项目内唯一 */
    String componentName
    /** 本地依赖AAR文件名称 */
    String localAarFileName
}
String EXTENSION_NAME = "alchemyComponentConfig"
if (extensions.findByName(EXTENSION_NAME) == null) {
    extensions.create(EXTENSION_NAME, AlchemyComponentExtension)
}
project.afterEvaluate {
AlchemyComponentExtension extension = extensions.findByName(EXTENSION_NAME)
    // 如果还没有移除现有的配置，警告
    if (extension != null && extension.componentModuleType != -1) {
        print("Warning: AlchemyComponentExtension is deprecated, please remove this from $project.buildFile")
    }
} 
```

根目录的 build.gradle 中增加配置：
```javascript 
subprojects {
apply from: rootProject.file('alchemy/gradles/publish.gradle')
} 
```
为了保证所有的Android Library 模块和Java Library模块都可以作为发布的模块或者发布模块的依赖。

原有的单aar模块的build.gradle修改为：
```javascript 
apply plugin: "lark.component.publish.single-artifact"
```warning
注意删除原有所有内容。
apply了该插件的模块不能有任何代码文件。

其他正常的模块的build.gradle移除以下代码：【可选】
```javascript 
apply from: rootProject.file('alchemy/gradles/publish.gradle')
alchemyComponentConfig {
  //...
}
```
老配置已经无人读取，若保留老配置会被警告。