LiquiBase 管理數據庫變動實踐

demo地址 gitee.com/youngboyvip…html

首先來了解下liquibase是什麼

Liquibase是一個用於跟蹤、管理和應用數據庫變化的開源的數據庫重構工具。它將全部數據庫的變化(包括結構和數據)都保存在XML文件中,便於版本控制java

liquibase 能夠幹嗎?

  • 不依賴於特定的數據庫,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12種數據庫,這樣在數據庫的部署和升級環節可幫助應用系統支持多數據庫。
  • 提供數據庫比較功能,比較結果保存在XML中,基於該XML你可用Liquibase輕鬆部署或升級數據庫。
  • 以XML存儲數據庫變化,其中以做者和ID惟一標識一個變化(ChangSet),支持數據庫變化的合併,所以支持多開發人員同時工做。
  • 在數據庫中保存數據庫修改歷史(DatabaseChangeHistory),在數據庫升級時自動跳過已應用的變化(ChangSet)。
  • 提供變化應用的回滾功能,可按時間、數量或標籤(tag)回滾已應用的變化。經過這種方式,開發人員可輕易的還原數據庫在任什麼時候間點的狀態。
  • 可生成數據庫修改文檔(HTML格式)
  • 提供數據重構的獨立的IDE和Eclipse插件。

傳統的開發模式中的數據庫修改之爲何使用liquibase

在平常的項目開發中,開發團隊常常將數據庫和應用程序視爲單獨的實體,這樣就致使了數據庫團隊與應用開發團隊分離形成團隊之間信息交流不順暢,信息交流不及時,這種狀況一般表現爲下面幾種行爲mysql

  • 手工變動數據庫
  • 不能與團隊的其餘成員分享數據庫變動
  • 使用不一致的方法變動數據庫或數據
  • 使用低效的手工方法管理數據庫版本之間的變動

上面的幾種行爲都是咱們在實際開發中遇到的問題,不只效率低並且出錯的機率也高,就算是老司機也會翻車git

解決上面問題的思路是 減小人工手工變動數據庫的機會,用程序管理數據庫版本的更替github

使用liquibase 管理數據庫的變動

使用步驟

  • step1: 建立一個數據庫 變動日誌(change log)文件。
  • step2: 在變動日誌文件內部建立一個 變動集(change set)。
  • step3: 經過命令行或構建腳本對數據庫運行變動集。
  • step4: 檢驗數據庫中的變動。

step1:建立change log文件(changlog.xml)web

change log 文件不必定要用xml寫 還可使用json sqlspring

<?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: 添加變動集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">

    <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等工具運行 命令演示express

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 任務排除,跳過執行指定任務.
相關文章
相關標籤/搜索