使用 LiquiBase 管理数据库变更
首先来了解下liquibase是什么
Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制
liquibase 可以干嘛?
- 不依赖于特定的数据库,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12种数据库,这样在数据库的部署和升级环节可帮助应用系统支持多数据库。
- 提供数据库比较功能,比较结果保存在XML中,基于该XML你可用Liquibase轻松部署或升级数据库。
- 以XML存储数据库变化,其中以作者和ID唯一标识一个变化(ChangSet),支持数据库变化的合并,因此支持多开发人员同时工作。
- 在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化(ChangSet)。
- 提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可轻易的还原数据库在任何时间点的状态。
- 可生成数据库修改文档(HTML格式)
- 提供数据重构的独立的IDE和Eclipse插件。
传统的开发模式中的数据库修改之为什么使用liquibase
在日常的项目开发中,开发团队经常将数据库和应用程序视为单独的实体,这样就导致了数据库团队与应用开发团队分离造成团队之间信息交流不畅,信息交流不及时,这种情况通常表现为下面几种行为
- 手工变更数据库
- 不能与团队的其他成员分享数据库变更
- 使用不一致的方法变更数据库或数据
- 使用低效的手工方法管理数据库版本之间的变更
上面的几种行为都是我们在实际开发中遇到的问题,不仅效率低而且出错的机率也高,就算是老司机也会翻车
解决上面问题的思路是 减少人工手工变更数据库的机会,用程序管理数据库版本的更替
使用liquibase 管理数据库的变更
使用步骤
- step1: 创建一个数据库 变更日志(change log)文件。
- step2: 在变更日志文件内部创建一个 变更集(change set)。
- step3: 通过命令行或构建脚本对数据库运行变更集。
- step4: 检验数据库中的变更。
step1:创建change log文件(changlog.xml)
change log 文件不一定要用xml写 还可以使用json sql
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
</databaseChangeLog>
step2: 添加变更集
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet id="1" author="bob">
<createTable tableName="department">
<column name="id" type="int">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="name" type="varchar(50)">
<constraints nullable="false"/>
</column>
<column name="active" type="boolean" defaultValueBoolean="true"/>
</createTable>
</changeSet>
</databaseChangeLog>
每个更改集都用“id”属性和“author”属性唯一标识。“作者”属性可以最大限度地减少重复的可能性。
liquibase将每个更改集视为要应用于数据库的原子更改。通常最好只在更改集中包含一个更改
step3: 运行ChangeSet
liquibase 可以使用命令行 Ant Maven Spring等工具运行
命令演示
liquibase --driver=com.mysql.jdbc.Driver \
--classpath=/path/to/classes \
--changeLogFile=com/example/db.changelog.xml \
--url="jdbc:mysql://localhost/example" \
--username=user \
--password=asdf \
update
step4: 检查你的数据库
你可以看到数据库现在包含一个名为“department”的表。还创建了另外两个表:“databasechangelog”和“databasechangeloglock”。
databasechangelog表包含已针对数据库运行的所有语句的列表。
databasechangeloglock表用于确保两台计算机不会同时尝试修改数据库。
在项目中使用liquibase (spring集成的方式)
liquibase提供了对Spring的支持所以我们只需要引用对应的jar包并进行相关的配置就可以使用了
这里使用gradle作为示例
step1: 添加依赖
compile "org.liquibase:liquibase-core"
compile "com.github.sabomichal:liquibase-mssql"
compile "com.microsoft.sqlserver:mssql-jdbc"
testCompile "com.mattbertolini:liquibase-slf4j"
step2: 添加liquibase文件
在resource目录下创建liquibase文件夹,并创建master.xml文件作为主文件
使用 <include file="config/liquibase/changelog/xxx.xml" relativeToChangelogFile="false"/>
目录引入changelog文件
step3: 配置liquibase
@Bean
public SpringLiquibase liquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) {
SpringLiquibase liquibase = new SpringLiquibase(taskExecutor, env);
liquibase.setDataSource(dataSource);
//制定changelog的位置,这里使用的一个master文件引用其他文件的方式
liquibase.setChangeLog("classpath:config/liquibase/master.xml");
liquibase.setContexts(liquibaseProperties.getContexts());
liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema());
liquibase.setDropFirst(liquibaseProperties.isDropFirst());
return liquibase;
}
liquibase会在启动的时候更新数据库,可以配置为异步执行
对现有数据库应用重构 & 常见的数据库操作
随着新特性添加到了应用程序中,经常需要变更数据库的结构或修改表约束。LiquiBase 提了超过 30 种数据库重构支持(参见 参考资料)。本节将介绍 4 种重构:添加列(Add Column)、删除列(Drop Column)、创建表(Create Table)和操作数据。
添加列
在项目的开始,几乎不可能考虑到数据库中的所有列。而有时候,用户要求新的特性 —例如为存储在系统中的信息收集更多的数据 —这就要求添加新的列。清单 4 使用 LiquiBase addColumn重构,向数据库中的 distributor表添加了一个列:
清单 4. 使用 LiquiBase 变更集中的 Add Column 数据库重构
<changeSet id="4" author="joe">
<addColumn tableName="distributor">
<column name="phonenumber" type="varchar(255)"/>
</addColumn>
</changeSet>
删除列
假如在以后几个版本中,您想要删除在清单 4 添加的 phonenumber列。只需要调用 dropColumn重构,如清单 5 所示:
删除一个数据库列
<dropColumn tableName="distributor" columnName="phonenumber"/>
创建表
向数据库添加一个新表也是常见的数据库重构。清单 6 创建了一个新表 distributor,定义了列、约束和默认值:
清单 6. 在 LiquiBase 中创建一个新数据库表
<changeSet id="3" author="betsey">
<createTable tableName="distributor">
<column name="id" type="int">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="name" type="varchar(255)">
<constraints nullable="false"/>
</column>
<column name="address" type="varchar(255)">
<constraints nullable="true"/>
</column>
<column name="active" type="boolean" defaultValue="1"/>
</createTable>
</changeSet>
操作数据
在应用了结构性数据重构后(例如添加列和创建表),通常需要向受重构影响的表中插入数据。此外,可能需要修改查找表(或其他类型的表)中的现有数据。清单 7 展示了如何使用一个 LiquiBase 变更集插入数据:
清单 7. 使用一个 LiquiBase 变更集插入数据
<changeSet id="3" author="betsey">
<code type="section" width="100%">
<insert tableName="distributor">
<column name="id" valueNumeric="3"/>
<column name="name" value="Manassas Beer Company"/>
</insert>
<insert tableName="distributor">
<column name="id" valueNumeric="4"/>
<column name="name" value="Harrisonburg Beer Distributors"/>
</insert>
</changeSet>
您应该编写用于操作数据的 SQL 脚本,因为使用 LiquiBase XML 变更集限制很多。有时候使用 SQL 脚本向数据库应用大量的变更会简单一些。LiquiBase 也可以支持这些情景。清单 8 调用变更集中的 insert-distributor-data.sql来插入 distributor表数据:
清单 8. 从 LiquiBase 变更集运行一个定制 SQL 文件
<changeSet id="6" author="joe">
<sqlFile path="insert-distributor-data.sql"/>
</changeSet>
LiquiBase 支持很多其他数据库重构,包括 Add Lookup Table 和 Merge Columns。可以使用如清单 4 到清单 8 所示的方式定义所有这些支持。
changeset xsd 参考
<!-- Children for changeSet -->
<xsd:group name="changeSetChildren">
<xsd:choice>
<xsd:element ref="comment" maxOccurs="1" />
<xsd:element ref="createTable" maxOccurs="unbounded" />
<xsd:element ref="dropTable" maxOccurs="unbounded" />
<xsd:element ref="createView" maxOccurs="unbounded" />
<xsd:element ref="renameView" maxOccurs="unbounded" />
<xsd:element ref="dropView" maxOccurs="unbounded" />
<xsd:element ref="insert" maxOccurs="unbounded" />
<xsd:element ref="addColumn" maxOccurs="unbounded" />
<xsd:element ref="sql" maxOccurs="unbounded" />
<xsd:element ref="createProcedure" maxOccurs="unbounded" />
<xsd:element ref="dropProcedure" maxOccurs="unbounded" />
<xsd:element ref="sqlFile" maxOccurs="unbounded" />
<xsd:element ref="renameTable" maxOccurs="unbounded" />
<xsd:element ref="renameColumn" maxOccurs="unbounded" />
<xsd:element ref="dropColumn" maxOccurs="unbounded" />
<xsd:element ref="mergeColumns" maxOccurs="unbounded" />
<xsd:element ref="modifyDataType" maxOccurs="unbounded" />
<xsd:element ref="createSequence" maxOccurs="unbounded" />
<xsd:element ref="alterSequence" maxOccurs="unbounded" />
<xsd:element ref="dropSequence" maxOccurs="unbounded" />
<xsd:element ref="renameSequence" maxOccurs="unbounded" />
<xsd:element ref="createIndex" maxOccurs="unbounded" />
<xsd:element ref="dropIndex" maxOccurs="unbounded" />
<xsd:element ref="addNotNullConstraint" maxOccurs="unbounded" />
<xsd:element ref="dropNotNullConstraint" maxOccurs="unbounded" />
<xsd:element ref="addForeignKeyConstraint" maxOccurs="unbounded" />
<xsd:element ref="dropForeignKeyConstraint" maxOccurs="unbounded" />
<xsd:element ref="dropAllForeignKeyConstraints"
maxOccurs="unbounded" />
<xsd:element ref="addPrimaryKey" maxOccurs="unbounded" />
<xsd:element ref="dropPrimaryKey" maxOccurs="unbounded" />
<xsd:element ref="addLookupTable" maxOccurs="unbounded" />
<xsd:element ref="addAutoIncrement" maxOccurs="unbounded" />
<xsd:element ref="addDefaultValue" maxOccurs="unbounded" />
<xsd:element ref="dropDefaultValue" maxOccurs="unbounded" />
<xsd:element ref="addUniqueConstraint" maxOccurs="unbounded" />
<xsd:element ref="dropUniqueConstraint" maxOccurs="unbounded" />
<xsd:element ref="setTableRemarks" maxOccurs="unbounded" />
<xsd:element ref="setColumnRemarks" maxOccurs="unbounded" />
<xsd:element ref="customChange" maxOccurs="unbounded" />
<xsd:element ref="update" maxOccurs="unbounded" />
<xsd:element ref="delete" maxOccurs="unbounded" />
<xsd:element ref="loadData" maxOccurs="unbounded" />
<xsd:element ref="loadUpdateData" maxOccurs="unbounded" />
<xsd:element ref="executeCommand" maxOccurs="unbounded" />
<xsd:element ref="stop" maxOccurs="unbounded" />
<xsd:element ref="output" maxOccurs="unbounded" />
<xsd:element ref="empty" maxOccurs="unbounded" />
<xsd:element ref="rollback" maxOccurs="1" />
<xsd:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded" />
</xsd:choice>
</xsd:group>
gradle liquibase 插件使用
安装gradle插件
gradle 2.0 以上写法
plugins {
id 'org.liquibase.gradle' version '2.0.0'
}
gradle 2.0 以下写法
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.liquibase:liquibase-gradle-plugin:2.0.0"
}
}
apply plugin: 'org.liquibase.gradle'
配置依赖
dependencies {
...
// 选择你需要的依赖
liquibaseRuntime 'org.liquibase:liquibase-core:3.6.1'
liquibaseRuntime 'org.liquibase:liquibase-groovy-dsl:2.0.0'
liquibaseRuntime 'mysql:mysql-connector-java:5.1.34'
...
}
配置 liquibase activities(类似profile)
//生成对比记录文件的位置
project.ext.diffChangelogFile = 'src/main/resources/config/liquibase/changelog/' + new Date().format('yyyyMMddHHmmss') + '_changelog.xml'
//生成sql文件的位置
project.ext.generateSql = 'src/main/resources/config/liquibase/sql/' + new Date().format('yyyyMMddHHmmss') + '_update.sql'
liquibase {
activities {
prod {
driver 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
url 'jdbc:sqlserver://localhost:1433;database=damManager'
username 'SA'
password 'yourStrong(!)Password'
changeLogFile 'config/liquibase/master.xml'
defaultSchemaName ''
logLevel 'debug'
baseDir 'src/main/resources/'
outputFile project.ext.generateSql
}
dev {
driver 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
url 'jdbc:sqlserver://localhost:1433;database=damManager'
username 'SA'
password 'yourStrong(!)Password'
password 'sql_2008dba'
changeLogFile 'config/liquibase/master.xml'
defaultSchemaName ''
logLevel 'debug'
baseDir 'src/main/resources/'
outputFile project.ext.generateSql
}
diffLog {
driver ''
url 'jdbc:sqlserver://localhost:1433;database=damManager'
username 'SA'
password 'yourStrong(!)Password'
changeLogFile project.ext.diffChangelogFile
defaultSchemaName ''
logLevel 'debug'
classpath 'src/main/resources/'
}
runList = 'dev' // 这里代表选择哪一个配置 可用参数代替
}
}
入口类配置
可通过自定义入口类,拓展liquibase的功能
拓展示例项目地址 https://gitee.com/youngboyvip/liquibase-cmd
默认入口类
liquibase.integration.commandline.Main
配置方法
liquibase {
mainClassName = 'liquibase.ext.commandline.LiquibaseAlternativeMain'
}
配置完成后就可以在gradle中看到liquibase的task
注意:如果使用了include等标签需要注意
file="xxx/xxx/xxx.xml"
绝对路径和相对路径,如果设置relativeToChangelogFile="false" 这说明你使用的是绝对路径,true 选择的是相对路径,可自定义资源加载器解决绝对路径和相对路径的问题,可以参考上方的示例项目
任务额外参数设置
liquibase.activities 中配置的是必须要配置的参数,一些命令可能需要额外的参数,这个时候就需要使用命令行动态创建参数
如果使用的是gradle wrapper 需要使用gradlew 执行命令
示例
//多个参数用空格隔开,命令参数可参考文章下方附录
gradlew <任务名> -PliquibaseCommandValue="--xx=yy --aa=bb"
使用经验
不要手动修改数据库
不要去修改原来的changeset
使用新的changeset
去修改
定时打tag 方便回滚
正在开发的项目中使用liquibase
使用思路: 把以前的数据库变更(比如表结构,存储过程,基础数据)导出来,然后使用liquibase管理,以后开发统一使用liquibase数据库管理变更)
step1: 导出数据库中的更改
可以使用数据库工具导出为sql
文件,或者使用liquibase命令行工具的generateChangelog
命令 导出XML变更文件
step2: 使用liquibase管理数据库变更
因为数据库中已经存在对应的变更,所以只需要把导出来的变更记录标记为已执行即可
这步操作可以使用liquibase命令行根据的changelogSync
或changelogSyncSQL
这个两个命令的区别是一个会直接修改数据库,一个是不直接修改数据库,一个是生成对应的sql,需要手动指向sql
liquibase 命令附录
命令名称 | 命令描述 |
---|---|
update | 更新数据库到当前版本 |
updateSQL | 写入SQL将数据库更新到currentversion或STDOUT |
updateCount <num> | 将下一个NUM更改应用到数据库 |
updateCountSQL <num> | 写入SQL以将下一个NUM更改应用到数据库 |
updateToTag <tag> | 使用指定的标记将数据库更新到变更集 |
updateToTagSQL <tag> | 使用指定的标记将SQL写入(到标准输出)到更改集 |
rollback <tag> | 将数据库回滚到指定标签的状态is was |
rollbackSQL <tag> | 生成数据库回滚到指定标签的sql |
rollbackToDate <date/time> | 将数据库回滚到给定日期/时间的状态is was。日期格式:yyyy-MM-dd 'HH: mm: ss |
rollbackToDateSQL <date/time> | 写入SQL以将数据库回滚到给定日期/时间版本的状态到STDOUT |
rollbackCount <value> | 回滚应用于数据库的最后一个<值>更改集 |
rollbackCountSQL <value> | 写入SQL以回滚最后一个<值>更改集到应用于数据库的stdoutapply |
futureRollbackSQL | 写入SQL,以便在更改日志中的更改完成后将数据库回滚到当前状态 |
futureRollbackSQL <value> | 在更改日志中的<值>更改完成后,写入SQL以将数据库回滚到当前状态 |
futureRollbackFromTagSQL <tag> | 写入(到标准输出)SQL,以便在更改后将数据库回滚到其当前状态 |
updateTestingRollback | 更新数据库,然后再次回滚更改。用于测试回滚支持 |
generateChangeLog | 写入更改日志XML以将数据库的当前状态复制到标准输出 |
snapshot | 将数据库的当前状态写入标准输出 |
snapshotReference | 将referenceUrl数据库的当前状态写入标准输出 |
Diff Commands | 数据库对比命令 |
diff [diff parameters] | 数据库对比命令 |
diffChangeLog [diff parameters] | 数据库对比日志 |
Documentation Commands | 文档命令 |
dbDoc <outputDirectory> | 基于当前数据库和更改日志生成类似javadoc的文档 |
Maintenance Commands | 维护命令 |
tag <tag string> | 给当前的数据库打标签,方便日后回滚 |
tagExists <tag string> | 检查对应的标签是否存在 |
status [--verbose] | 输出为执行changeset的行数 |
unexpectedChangeSets[--verbose] | 输出本地不存在changeset 行数 |
validate | 检查是否有错误的changelog |
calculateCheckSum <id> | 检查指定changeset id 的checksum值 格式为 filepath::id::author
|
clearCheckSums | 从数据库日志中删除所有保存的校验和 |
changelogSync | 标记所有的更改已执行 |
changelogSyncSQL | 生成标记更改已执行的sql并输出到标准输出 |
markNextChangeSetRan | 将下一个变更标记为已执行 |
markNextChangeSetRanSQL | 生成将下一个变更标记为已执行的sql并输出到标准输出 |
listLocks | 列出liquibase数据库锁 |
releaseLocks | 释放所有的liquibase数据库锁 |
dropAll | 删除数据库表(慎用!) |
必传参数
参数 | 描述 |
---|---|
--changeLogFile=<path and filename> | 变更文件日志路径 |
--username=<value> | 数据库用户名 |
--password=<value> | 数据库密码 |
--url=<value> | 数据库url |
可选的参数
参数 | 描述 |
---|---|
--classpath=<value> | 类路径包含迁移文件和JDBC驱动程序 |
--driver=<jdbc.driver.ClassName> | 数据库驱动程序类名 |
--databaseClass=<database.ClassName> | 自定义liquibase.database。Databaseimplementation使用 |
--propertyProviderClass=<properties.ClassName> | 要使用的自定义属性实现 |
--defaultSchemaName=<name> | 要使用的默认数据库模式 |
--contexts=<value> | 更改要执行的上下文 |
--labels=<expression> | 定义要执行的标签变更集的表达式 |
--defaultsFile=</path/to/file.properties> | 带有默认选项值的文件(默认:./liquibase.properties) |
--delimiter=<string> | 与executeSql命令一起使用,用于设置用于分解包含多个语句的文件的字符串。 |
--driverPropertiesFile=</path/to/file.properties> | 在要创建的JDBC连接上设置自定义属性的文件 |
--changeExecListenerClass=<ChangeExecListener.ClassName> | 自定义更改Execlistener实现以使用 |
--changeExecListenerPropertiesFile=</path/to/file.properties> | 用于自定义更改Exec侦听器的属性 |
--liquibaseCatalogName=<name> | 带有liquibase表的目录的名称 |
--liquibaseSchemaName=<name> | 带有liquibase表的模式的名称 |
--databaseChangeLogTableName=<name> | Liquibase ChangeLogtable的名称(默认:DATABASECHANGELOG) |
--databaseChangeLogLockTableName=<name> | Liquibase ChangeLogLock表的名称(默认:DATABASECHANGELOGLOCK) |
--liquibaseSchemaName=<name> | 带有liquibase表的模式的名称 |
--includeSystemClasspath=<true|false> | 将系统类路径包含在Liquibase类路径中(默认:true) |
--promptForNonLocalDatabase=<true|false> | 如果非本地主机数据库(默认:false),则提示 |
--logLevel=<level> | 执行日志级别(调试、信息、警告、严重、关闭) |
--logFile=<file> | 日志文件 |
--currentDateTimeFunction=<value> | 覆盖SQL中使用的当前日期时间函数。适用于不受支持的数据库 |
--outputDefaultSchema=<true|false> | 如果为真,SQL对象引用包括模式名,甚至ifit也是默认模式。默认值为true |
--outputDefaultCatalog=<true|false> | 如果为真,SQL对象引用包括目录名,甚至ifit也是默认目录。默认值为true |
--outputFile=<file> | 为写入输出的命令写入输出的文件,例如updateSQL。如果没有指定,则写入sysout。 |
--help | 打印此消息 |
--version | 打印此版本信息 |
diff 命令必传参数
参数 | 描述 |
---|---|
--referenceUsername=<value> | 对比数据库用户名 |
--referencePassword=<value> | 对比数据库密码 |
--referenceUrl=<value> | 对比数据库url |
diff 命令可选参数
参数 | 描述 |
---|---|
--defaultCatalogName=<name> | 默认数据库目录 |
--defaultSchemaName=<name> | 默认数据库模式 |
--referenceDefaultCatalogName=<name> | 对比数据库要使用的参考数据库目录 |
--referenceDefaultSchemaName=<name> | 对比数据库要使用的数据库模式 |
--schemas=<name1,name2> | 从比较中包含对象的数据库模式 |
--referenceSchemas=<name1,name2> | 引用数据库模式来包含来自比较的对象,只有在与——模式不同时才需要 |
--outputSchemaAs=<name1,name2> | 在diffChangeLog/generateChangeLog上,使用这些名称作为schemaNameinstead of the real name。 |
--includeCatalog=<true|false> | 如果为真,则在生成的变更集中将目录默认为false |
--includeSchema=<true|false> | 如果为真,模式将包含在生成的changeSetsDefaults中 |
--referenceDriver=<jdbc.driver.ClassName> | 引用数据库驱动程序类名 |
--dataOutputDirectory=DIR | 以CSV格式输出给定目录中的数据 |
--diffTypes | diff类型的列表,包括inChange日志用一个逗号分隔 |
官方参考文档 http://www.liquibase.org/documentation/command_line.html
Gradle 命令参考
参数 | 描述 |
---|---|
-?, -h, --help | 显示帮助 - - ..... |
-a, --no-rebuild | 忽略"项目依赖",假设模块web依赖于base,采用此参数后将不再构建base模块,即使base模块代码存在更新也不会(注意:如果base模块是clean的,那么加此参数构建不会将base依赖构建到项目中来,相当于忽略掉base依赖). |
-b, --build-file | 执行指定的*.gradle文件,默认首先会寻找当前目录下的 build.gradle文件或依据settings.gradle中的配置寻找子项目中的 build.gradle, 采用-b参数将会忽略setting文件. |
-c, --settings-file | 执行指定的*.gralde文件,默认settings.gradle. |
--console | 指定控制台输出类型,可选值有 'plain', 'auto' (默认) , 'rich'.plain 是生成普通的文本,该选项禁止所有颜色和富文本输出; auto (默认)当构建程序与控制台相关联时启动 颜色和富文本输出,或者不关联时生成普通文本;rich 启动颜色和富文本输出,忽略构建程序是否关联了控制台,如果没有关联构建输出将输出 ANSI 控制字符来生产富文本输出 |
--no-color | 取消控制台着色效果,不过此选项已经不推荐使用,推荐使用 --console=plain替代. |
--continue | 忽略报错继续构建,默认报错后终止构建. |
-d, --debug | 指定日志输出级别为debug,可打印一般堆栈信息. |
-q, --quiet | 指定日志输出形式为安静模式,只打印errors. |
-i, --info | 指定日志级别为info. |
-S, --full-stacktrace | 指定日志级别为full-stacktrace,打印完整堆栈异常信息,超长超多. |
-s, --stacktrace | 指定日志级别为stacktrace,会打印所有堆栈异常信息. |
-D, --system-prop | -D属性会被传送给启动Gradle的jvm,作为一个系统属性被jvm使用(例如:-Dname=tom). |
-P, --project-prop | 设置Gradle的项目参数,会被直接加载到Gradle领域对象上(例如:-Pversion=1.2). |
--configure-on-demand | 只在构建中应用项目相关配置Only relevant projects are configured in this build run. This means faster build for large multi-builds. [incubating] |
--daemon | 使用Gradle守护进程执行构建,如果没有守护进程则启动一个守护进程. |
--no-daemon | 禁用守护进程,不使用守护进程执行构建. |
--stop | 如果存在守护进程,那么终止它. |
--foreground | 以foreground形式启动守护进程. |
-g, --gradle-user-home | 指定默认的指定Gradle 用户home 目录.默认在"用户目录/.gradle". |
--gui | 运行Gradle GUI图形界面程序. |
-I, --init-script | 执行指定init脚本,这个脚本会在build之前执行.会按照当前目录,USER_HOME/.gradle/ ,USER_HOME/.gradle/init.d/,GRADLE_HOME/init.d/的顺序寻找init.gradle文件 |
-m, --dry-run | 模拟任务执行过程并将过程打印出来,并非真正执行,只是为了让你知道会执行哪些步骤. |
--max-workers | 指定采用几个CPU核心执行构建/ |
--offline | 采用离线模式构建项目,当然如果你的gav中存在+,当心构建失败. |
-p, --project-dir | 指定build.gradle脚本所在目录,默认为当前目录.可以通过此参数指定子项目目录后,默认会执行指定目录下的build.gradle文件. |
--parallel | 采用并行模式运行 |
--parallel-threads | 并行构建执行采用的线程数,不过已经弃用,推荐采用--parallel --max-workers替代. |
--profile | 存储一份执行报告到<build_dir>/reports/profile,包括总时间和在配置和任务执行阶段的细节。并以时间大小倒序排列,并且记录了任务的执行情况.Gradle会根据构建时间命名这些报告文件. |
--project-cache-dir | 指定项目缓存目录,默认在项目根目录下的.gradle文件夹. |
--recompile-scripts | 会丢弃缓存的脚本,然后重新编译此脚本并将其存在缓存中.通过这种方式可以强制 Gradle 重新生成缓存. |
--refresh-dependencies | 强制刷新依赖,忽略缓存重新下载 |
--rerun-tasks | 强制重新执行任务,忽略任务缓存,默认情况下是增量构建 |
-t, --continuous | 连续构建模式,采用此模式后会监听所有构建文件变化,文件发生变化后会自动重新构建 |
-u, --no-search-upward | 不应用父目录中的ettings.gradle文件,如果不添加此项,父目录的setting.gradle会覆盖子目录下的配置. |
-v, --version | 打印gradle版本信息. |
-x, --exclude-task | 任务排除,跳过执行指定任务. |