LiquiBase 管理資料庫變更實踐

youngboyvip發表於2019-04-13

demo地址 gitee.com/youngboyvip…

首先來了解下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的功能 擴充示例專案地址 gitee.com/youngboyvip…

預設入口類 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命令列根據的changelogSyncchangelogSyncSQL 這個兩個命令的區別是一個會直接修改資料庫,一個是不直接修改資料庫,一個是生成對應的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日誌用一個逗號分隔

官方參考文件 www.liquibase.org/documentati…

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

相關文章