2013-08-08 31 views
6

Chúng tôi có hai cơ sở dữ liệu mà chúng tôi muốn quản lý việc di chuyển của chúng bằng cách sử dụng plugin gradel của đường bay.Quản lý nhiều cơ sở dữ liệu với plugin di chuyển đường bay

Tôi muốn có một tác vụ duy nhất có thể di chuyển cả hai cơ sở dữ liệu. Tuy nhiên, tôi không thể có được nhiệm vụ flywayMigrate được gọi hai lần từ một tác vụ duy nhất.

Dưới đây là những gì tôi có ...

task migrateFoo() { 
    doFirst { 
     flyway { 
      url = 'jdbc:mysql://localhost/foo' 
      user = 'root' 
      password = 'password' 
      locations = ['filesystem:dev/src/db/foo'] 
      sqlMigrationPrefix = "" 
      initOnMigrate = true 
      outOfOrder = true 
     } 
    } 
    doLast { 
     tasks.flywayMigrate.execute() 
    } 
} 

task migrateBar() { 
    doFirst { 
     flyway { 
      url = 'jdbc:mysql://localhost/bar' 
      user = 'root' 
      password = 'password' 
      locations = ['filesystem:dev/src/db/bar'] 
      sqlMigrationPrefix = "" 
      initOnMigrate = true 
      outOfOrder = true 
     } 
    } 
    doLast { 
     tasks.flywayMigrate.execute() 
    } 
} 

task migrate(dependsOn: ['migrateFoo','migrateBar']) {} 

Rõ ràng gọi hoặc migrateFoo hoặc migrateBar từ dòng lệnh hoạt động tốt, tuy nhiên, nếu tôi cố gắng gọi cho nhiệm vụ chỉ chuyển cơ sở dữ liệu foo được cập nhật.

Cả tác vụ doFirst và doLast của tác vụ migrateBar đều được gọi, tuy nhiên, tác vụ tasks.flywayMigrate.execute() không được gọi lần thứ hai từ migrateBar.

Tôi làm cách nào để có được đường bay di chuyển cả foo và thanh từ một tác vụ?

Trả lời

2

Trước tiên, bạn không bao giờ nên gọi execute() về công việc (những điều xấu sẽ xảy ra). Ngoài ra, một nhiệm vụ sẽ được thực hiện tối đa một lần cho mỗi lần gọi Gradle.

Để trả lời câu hỏi của bạn, dường như plugin đường bay không hỗ trợ có nhiều tác vụ cùng loại. Nhìn vào thực hiện của nó, tôi nghĩ bạn sẽ phải cuộn nhiệm vụ của riêng bạn. Một cái gì đó như:

import com.googlecode.flyway.core.Flyway 
import org.katta.gradle.plugin.flyway.task.AbstractFlywayTask 

class MigrateOtherDb extends AbstractFlywayTask { 
    @Override 
    void executeTask(Flyway flyway) { 
     // set any flyway properties here that differ from 
     // those common with other flyway tasks 
     println "Executing flyway migrate" 
     flyway.migrate() 
} 

task migrateOtherDb(type: MigrateOtherDb) 

Tôi khuyên bạn nên gửi yêu cầu tính năng để hỗ trợ nhiều tác vụ cùng loại, với cách thuận tiện để định cấu hình chúng.

+0

Bạn có con trỏ tốt trong tài liệu về cách triển khai tính năng này không? –

+0

Về cơ bản, các lớp nhiệm vụ cần khai báo tất cả các thuộc tính (hoặc nhiều hơn) mà phần mở rộng có, sử dụng các thuộc tính mở rộng làm mặc định. Hãy xem các plugin chất lượng mã trong cơ sở mã Gradle (ví dụ: 'CheckstylePlugin' hoặc' FindbugsPlugin'). Theo quy ước, các lớp nhiệm vụ cụ thể không có 'Task' trong tên của chúng. –

+0

OK, cảm ơn tôi sẽ xem xét nó. BTW, Jeremy đang sử dụng Plugin này tại đây: https://github.com/flyway/flyway/tree/master/flyway-gradle-plugin –

0

Tôi cũng gặp vấn đề tương tự. Tôi muốn chạy di chuyển đường bay cho các cơ sở dữ liệu khác nhau và thậm chí cho cùng một cơ sở dữ liệu với các cấu hình khác nhau trong ONE gradle build. cho mỗi cơ sở dữ liệu tôi cần phải di chuyển các bảng dữ liệu bình thường và các bảng dữ liệu tĩnh, vì vậy tôi sử dụng hai bảng phiên bản đường bay và cũng có hai vị trí cho các tập lệnh. Ví dụ.

ENV: dev MIGRATION1: data (locations: db/scripts/data table: _flyway_version_data) 
     MIGRATION2: static (locations: db/scripts/static table: _flyway_version_static) 

ENV: test MIGRATION1 .... 
      MIGRATION2 .... 

Như Peter nêu trên, các tác vụ trên đường bay chỉ được thực thi ONCE bất kể bạn gọi chúng thường xuyên như thế nào.

Cách giải quyết tôi thấy dường như không phải là đẹp nhất, nhưng nó hoạt động:

trong build.gradle

task migrateFlywayDevData(type: GradleBuild) { 
    buildFile = 'build.gradle' 
    tasks = ['flywayMigrate'] 
    startParameter.projectProperties = [env: "dev", type="data"] 
} 

task migrateFlywayDevStatic(type: GradleBuild) { 
    buildFile = 'build.gradle' 
    tasks = ['flywayMigrate'] 
    startParameter.projectProperties = [env: "test", type="static"] 
} 
....(task defs for test env) 

Về cơ bản tôi tạo ra một build gradle mới cho mỗi người trong số các cấu hình.

"buildFile = 'build.gradle'"

đề cập đến bản thân, vì vậy tất cả các mã được chứa trong một tập tin build.gradle. Cuộc gọi gradle là:

gradle migrateFlywayDevData migrateFlywayDevStatic ... 

Đây là phiên bản đầu tiên. vì vậy mã có thể dễ dàng được cải thiện. Tuy nhiên giải pháp này cho phép bạn thực hiện các nhiệm vụ bay nhiều lần với một cuộc gọi gradle.

Vui lòng nhận xét (cấu hình plugin đường bay không được hiển thị ở đây)