Gradleハンズオンをやりました
社内勉強会の一貫として、Gradleハンズオンを開催してみました。
Gradle入門の位置づけでやりましたが、時間配分がグダグダで最後の方は飛ばし飛ばしやってしまいました。
分かりづらかったなぁ…反省。
サンプルコード
共通のタスクをプロジェクト毎の設定値を利用して実行する
昨日の続き。
build.gradle
allprojects { configurations { svnant } ext { dep_repopath = new File("${project.rootDir}/../svn_repo/").canonicalPath dep_destpath = 'dep_project' depProjects = [] } dependencies { svnant fileTree(dir: "${project.rootDir}/lib_svnant", include: '**/*.jar') } task svnCheckout << { ant.taskdef(resource: 'org/tigris/subversion/svnant/svnantlib.xml', classpath: configurations.svnant.asPath) depProjects.each { def projectName -> def checkoutDest = "${project.rootDir}/${dep_destpath}/${projectName}" ant.svn(javahl: 'false', svnkit: 'true', failonerror: 'false') { ant.checkout(url: "file://${dep_repopath}/${projectName}", destpath: checkoutDest) ant.update(dir: checkoutDest) } } } } subprojects { apply plugin: 'java' repositories { mavenCentral() } dependencies { compile 'org.slf4j:slf4j-api:1.7.5' testCompile 'junit:junit:4.11' } } project(':App') { ext { depProjects = ["Stab"] } dependencies { compile project(':dep_project/Stab') } compileJava.dependsOn svnCheckout }
全プロジェクト共通のタスクsvnCheckoutでは、プロパティdepProjectsで指定されたプロジェクトをチェックアウトしてくる。
共通部分では
ext { dep_repopath = new File("${project.rootDir}/../svn_repo/").canonicalPath dep_destpath = 'dep_project' depProjects = [] }
のようにdepProjectsを空リストとして宣言しておき、Appプロジェクトの設定の方で
project(':App') { ext { depProjects = ["Stab"] } dependencies { compile project(':dep_project/Stab') } compileJava.dependsOn svnCheckout }
depProjectsに設定値を与えてあげると、共通のタスクをプロジェクト固有の設定値で実行することが出来る。
依存プロジェクトをsvnからチェックアウトしてからビルドを
昨日の続き。
Gradleのマルチプロジェクトビルドで、依存プロジェクトをSVNからチェックアウトしてからビルドを実行するサンプル。
kaakaa/GradleMultiprojectSample
とりあえず動いてはいるけど、SVN checkoutが汎用的に作れていない。
Gradleのタスクに引数を与えられれば、各プロジェクト毎に依存しているプロジェクト名を宣言して、SVN checkoutのタスクに渡して処理もできるんだけど…。
ん〜微妙。
GradleからSVNコマンドを実行する
SvnAntを使用した。
Gradle svn-ant Sample
マルチプロジェクトビルドのサンプル
Gradle マルチプロジェクトビルドのサンプルの備忘。
下記のようなプロジェクト構造の時、Appプロジェクトをビルドする。
AppプロジェクトはStabプロジェクトにプロジェクト依存している。
├── App └── build ├── build.gradle ├── dep_project │ └── Stab └── settings.gradle
マルチプロジェクトの設定
BuildScript/settings.gradle にビルド対象のプロジェクトを記述する。
settings.gradle
includeFlat 'App' include 'dep_project/Stab'
includeFlat はsettings.gradleが存在するディレクトリと同階層のプロジェクトを指定する。
includeはsettings.gradleが存在するディレクトリ配下のプロジェクトを指定する。
ビルドの設定
BuildScript/build.gradle にビルドの設定を記述する。
build.gradle
subprojects { apply plugin: 'java' repositories { mavenCentral() } dependencies { compile 'org.slf4j:slf4j-api:1.7.5' testCompile 'junit:junit:4.11' } } project(':App') { dependencies { compile project(':dep_project/Stab') } }
subprojects に囲まれた部分の設定は、settings.gradleで指定された全てのプロジェクトに適用される。
プロジェクト固有の設定は project(':${プロジェクト名}') に記述する。
(この時、subprojectsの依存関係にStabプロジェクトを記述してしまい、ビルド実行時に「StabプロジェクトをビルドするためにStabプロジェクトをビルドしなければならない」という循環参照エラーで怒られるという失態を犯しました…)
プロジェクト依存の設定は下記の用に設定する。
dependencies { compile project(':dep_project/Stab') }
ビルドの実行
build.gradleを普通に実行すると、settings.gradleに記述されたプロジェクト全てのビルドが実行されます。
(ビルドの順番ってどう決まるんだろ?)
gradle -b BuildScript/build.gradle build
ルートディレクトリから実行する場合、-b オプションでgradleスクリプトファイルを指定します。
特定のプロジェクトに対するビルドを実行したい場合は下記のようにします。
gradle -b BuldScript/build.gradle :App:build :dep_project/Stab:compileJava UP-TO-DATE :dep_project/Stab:processResources UP-TO-DATE :dep_project/Stab:classes UP-TO-DATE :dep_project/Stab:jar UP-TO-DATE :App:compileJava UP-TO-DATE :App:processResources UP-TO-DATE :App:classes UP-TO-DATE :App:jar UP-TO-DATE :App:assemble UP-TO-DATE :App:compileTestJava UP-TO-DATE :App:processTestResources UP-TO-DATE :App:testClasses UP-TO-DATE :App:test UP-TO-DATE :App:check UP-TO-DATE :App:build UP-TO-DATE BUILD SUCCESSFUL Total time: 6.736 secs
依存しているStabプロジェクトに対するjarタスクも一緒に実行されています。
とりあえず今日はここまで。
GradleでSVNリポジトリから依存プロジェクトをチェックアウトしてからビルド実行が出来るようにすることが目標。
Gradle svn-ant Sample
Gradleはとても便利で高機能なのに日本語の書籍がないのがもったいないですね。
Gradle in Actionの邦訳とか出ないかな。
- 作者: Benjamin Muschko,Hans Dockter
- 出版社/メーカー: Manning Pubns Co
- 発売日: 2014/03/09
- メディア: ペーパーバック
- この商品を含むブログを見る
Scalaを触ってみた
社内勉強会用にScalaを触って簡単なアプリを作ってみた(未完成)
kaakaa/DotDispClasspath
ScalaはBetterJavaとして触りやすかった印象。
でもちょっとした時に触るなら、GroovyConsoleが付いてるGroovyかなぁ。
ただ、クラスの種類がJavaよりも多いのは、目的にあった使い分けが出来そうで良さ気。
使いドコロ見極めていきたい。
ParallelCollectionが簡単に使えるのは素晴らしい。
TracLightningのMavenリポジトリにアップロードできない
Gradle Maven Pluginを使ってTracLightningのMavenリポジトリにJarをアップロードしようとしてみたところ、アップロード先のディレクトリを用意しておかないとエラーとなった。
build.gradle
apply plugin: 'java' apply plugin: 'maven' group = 'org.kaakaa.sample' archivesBaseName = 'homeSample' version = '1.0' repositories { mavenCentral() } uploadArchives { repositories.mavenDeployer { repository(url: 'http://192.168.3.10/maven/') { authentication(userName: 'admin', password: 'admin') } } } dependencies { compile 'org.slf4j:slf4j-api:1.7.5' testCompile 'junit:junit:4.11' }
アップロード先ディレクトリを作っておかないと。
[vagrant@localhost]/vagrant/dev/gradle/mvn_sample% gradle uploadArchives --info Starting Build Settings evaluated using settings file '/vagrant/dev/gradle/mvn_sample/settings.gradle'. Projects loaded. Root project using build file '/vagrant/dev/gradle/mvn_sample/build.gradle'. Included projects: [root project 'mvn_sample'] Evaluating root project 'mvn_sample' using build file '/vagrant/dev/gradle/mvn_sample/build.gradle'. All projects evaluated. Selected primary task 'uploadArchives' Tasks to be executed: [task ':compileJava', task ':processResources', task ':classes', task ':jar', task ':uploadArchives'] :compileJava (Thread[main,5,main]) started. :compileJava Skipping task ':compileJava' as it is up-to-date (took 1.57 secs). :compileJava UP-TO-DATE :compileJava (Thread[main,5,main]) completed. Took 1.704 secs. :processResources (Thread[main,5,main]) started. :processResources Skipping task ':processResources' as it has no source files. :processResources UP-TO-DATE :processResources (Thread[main,5,main]) completed. Took 0.014 secs. :classes (Thread[main,5,main]) started. :classes Skipping task ':classes' as it has no actions. :classes UP-TO-DATE :classes (Thread[main,5,main]) completed. Took 0.007 secs. :jar (Thread[main,5,main]) started. :jar Skipping task ':jar' as it is up-to-date (took 0.206 secs). :jar UP-TO-DATE :jar (Thread[main,5,main]) completed. Took 0.25 secs. :uploadArchives (Thread[main,5,main]) started. :uploadArchives Executing task ':uploadArchives' (up-to-date check took 0.004 secs) due to: Task has not declared any outputs. Publishing configuration: configuration ':archives' Publishing to org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer@52068591 [ant:null] Deploying to http://192.168.3.10/maven/ Uploading: org/kaakaa/sample/homeSample/1.0/homeSample-1.0.jar to repository remote at http://192.168.3.10/maven/ Transferring 1K from remote [ant:null] An error has occurred while processing the Maven artifact tasks. Diagnosis: Error deploying artifact 'org.kaakaa.sample:homeSample:jar': Error deploying artifact: Authorization failed: Access denied to: http://192.168.3.10/maven/org/kaakaa/sample/homeSample/1.0/homeSample-1.0.jar :uploadArchives FAILED :uploadArchives (Thread[main,5,main]) completed. Took 3.328 secs. FAILURE: Build failed with an exception. What went wrong: Execution failed for task ':uploadArchives'. > Could not publish configuration 'archives' > Error deploying artifact 'org.kaakaa.sample:homeSample:jar': Error deploying artifact: Authorization failed: Access denied to: http://192.168.3.10/maven/org/kaakaa/sample/homeSample/1.0/homeSample-1.0.jar Try: Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. BUILD FAILED Total time: 14.628 secs Stopped 0 compiler daemon(s).
アップロード先のディレクトリ(%TRAC_HOME%/maven/org/kaakaa/sample/homeSample/1.0/)を作っておくと。
[vagrant@localhost]/vagrant/dev/gradle/mvn_sample% gradle uploadArchives --info Starting Build Settings evaluated using settings file '/vagrant/dev/gradle/mvn_sample/settings.gradle'. Projects loaded. Root project using build file '/vagrant/dev/gradle/mvn_sample/build.gradle'. Included projects: [root project 'mvn_sample'] Evaluating root project 'mvn_sample' using build file '/vagrant/dev/gradle/mvn_sample/build.gradle'. All projects evaluated. Selected primary task 'uploadArchives' Tasks to be executed: [task ':compileJava', task ':processResources', task ':classes', task ':jar', task ':uploadArchives'] :compileJava (Thread[main,5,main]) started. :compileJava Skipping task ':compileJava' as it is up-to-date (took 1.503 secs). :compileJava UP-TO-DATE :compileJava (Thread[main,5,main]) completed. Took 1.643 secs. :processResources (Thread[main,5,main]) started. :processResources Skipping task ':processResources' as it has no source files. :processResources UP-TO-DATE :processResources (Thread[main,5,main]) completed. Took 0.01 secs. :classes (Thread[main,5,main]) started. :classes Skipping task ':classes' as it has no actions. :classes UP-TO-DATE :classes (Thread[main,5,main]) completed. Took 0.006 secs. :jar (Thread[main,5,main]) started. :jar Skipping task ':jar' as it is up-to-date (took 0.201 secs). :jar UP-TO-DATE :jar (Thread[main,5,main]) completed. Took 0.244 secs. :uploadArchives (Thread[main,5,main]) started. :uploadArchives Executing task ':uploadArchives' (up-to-date check took 0.004 secs) due to: Task has not declared any outputs. Publishing configuration: configuration ':archives' Publishing to org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer@6ebcf6bf [ant:null] Deploying to http://192.168.3.10/maven/ Uploading: org/kaakaa/sample/homeSample/1.0/homeSample-1.0.jar to repository remote at http://192.168.3.10/maven/ Transferring 1K from remote Uploaded 1K [INFO] Retrieving previous metadata from remote [INFO] repository metadata for: 'artifact org.kaakaa.sample:homeSample' could not be found on repository: remote, so will be created [INFO] Uploading repository metadata for: 'artifact org.kaakaa.sample:homeSample' [INFO] Uploading project information for homeSample 1.0 :uploadArchives (Thread[main,5,main]) completed. Took 3.839 secs. BUILD SUCCESSFUL Total time: 14.936 secs Stopped 0 compiler daemon(s).
TracLightning側がディレクトリ作成の許可してないからなのかな?
設定どこだろう。
SVG事始め
SVGについて調べたことまとめ。
Wikiまとめて、動かしてみて、こういうことやりたいな〜程度のまとめ。
動かしたサンプルは下記に。
kaakaa/SVGSample
1年ぶりにアップ。
ルート弾き主体だけどキメが多くて弾いてて楽しい。
歌詞がアレだけど、それも含めて曲として面白いなぁ。
聖飢魔IIはバンドでやる前までは蝋人形の館と閣下のキャラで色物と決めつけて特に聴く気も起きなかったけど、普通に良いバンド。
iMovieがアップデートされてたけど、UIがシンプルになって使いやすくなってた印象だけど、ファイル出力時の選択肢が少なくなったような…。
普通にファイル出力すると最小解像度でも100MB近くいって困った。
iTunesに出力でm4a出力したら30MBちょいになったからなんとかなった。