kaakaa Blog

この世は極楽 空にはとんぼ

共通のタスクをプロジェクト毎の設定値を利用して実行する

昨日の続き。

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 マルチプロジェクトビルドのサンプルの備忘。

第56章 マルチプロジェクトのビルド

下記のようなプロジェクト構造の時、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の邦訳とか出ないかな。

Gradle in Action

Gradle in Action

Scalaを触ってみた

社内勉強会用にScalaを触って簡単なアプリを作ってみた(未完成)
kaakaa/DotDispClasspath

ScalaはBetterJavaとして触りやすかった印象。
でもちょっとした時に触るなら、GroovyConsoleが付いてるGroovyかなぁ。

ただ、クラスの種類がJavaよりも多いのは、目的にあった使い分けが出来そうで良さ気。
使いドコロ見極めていきたい。

ParallelCollectionが簡単に使えるのは素晴らしい。

TracLightningのMavenリポジトリにアップロードできない

Gradle Maven Pluginを使ってTracLightningMavenリポジトリに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ちょいになったからなんとかなった。

lazyloadっぽいもの

kaakaa/PPTGallery
シコシコ改修中。

スライドのページが多い時に最初に全ての画像を読み込むと重くなりそうなので、lazyload的なのを適用しようとしてみた。

Lazy Load Plugin for jQuery
前から目をつけていたコレを組み込んで見たけど、スクロールでなくjQueryのtoggleで画像を表示させるのが原因か、スライド表示後にウインドウサイズに合わせてリサイズするのが原因か分からないけど、lazyloadさせるべき画像が表示されなかった。

なので、別の方法を探してると下記のエントリを発見。
Lazy loading of images (jquery) without scrolling | Suman Srinivasan's Code Blog

$("img.lazyload").each(function() {
    $(this).attr("src", $(this).attr("original"));
    $(this).removeAttr("original");
});

単純にimgタグのsrcにダミーの画像を表示させておき、画像表示するイベントが起こった所に上のスクリプトを入れて、srcのダミー画像とoriginalに設定していた本来の画像のURLを入れ替えるだけ。

画像表示後の処理とかは実装してあるので、コレだけで十分そう。