使用 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 | 任務排除,跳過執行指定任務. |