Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo

  • 1,668 views
Uploaded on

第2回 g* ワークショップ...

第2回 g* ワークショップ
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo

More in: Technology , Travel , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,668
On Slideshare
1,668
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
4
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. JGGUG 第弐回 g* workshop Grails-1.1を斬る! ∼Grails-1.1からのチーム開発∼ 間近 リ ース .1. 1リ r ai ls-1 Gdef speaker = new Cast(name:”T.Yamamoto”,version:”G*2-2009-05-08”)
  • 2. 自己紹介名前:山本 剛 (やまもとつよし)所属:ニューキャスト「Grails徹底入門」9-11章、書きました。 Grails Acegi Plugin作った人。ブログ http://xmldo.blogspot.com/ http://d.hatena.ne.jp/mottsnite/ こっちがメインかも
  • 3. おさらい
  • 4. Grailsとは?よく聞く説明「Groovyで実装されたRuby on Rails」!?   合ってるようで間違いJava+Groovyで実装された、CoC、DRYの概念を取り入れた( RoR にインスパイアされた)、Webアプリケーション開発環境。 基礎はJavaでの開発で信頼されたSpring,Hibernate等を 使用している。 そして、それらをシンプルに利用できる環境。Grails, the Platform (DGG2引用)
  • 5. Grailsの構成図 Grails Groovy Spring Hibernate SiteMesh 基礎部分はJava(+Groovy) JVMHibernate:ORマッピングSpring: DIコンテナ・多機能なラッパーフレームワークSiteMesh:レイアウトフレームワークJetty: サーブレットコンテナHSQLDB:ピュアJavaなデータベース
  • 6. デモgrails create-app democd demograils create-domain-class Bookgrails create-controller Bookgrails run-appブラウザで開く--止める--grails install-plugin acegi--プラグインインストールは前より早くなった!! ※要ネットワーク
  • 7. Grails-1.1
  • 8. Grails-1.1リリースJava5以上での動作 CIとかに!Ant+IvyとMavenビルドのサポートスタンドアロンGORM Springな人へ!プラグインの新機能:グローバルプラグイン、他動推移的なプラグイン解決、ローカルリポジトリー対応、他 チーム!?Springネームスペースサポート劇的に向上したパフォーマンス マジ!?テストフレームワークMVCレイヤーとGORM等のGrailsコアへの多くの新機能と改善Groovyは最新の1.6に更新
  • 9. Grailsの構成図 Grails .1 4 Groovy Spring 3. Hibernate 3 SiteMesh 2. 6 5 5. 1. 2. 基礎部分はJava(+Groovy) JVM 5 1.Hibernate:ORマッピングSpring: DIコンテナ・多機能なラッパーフレームワークSiteMesh:レイアウトフレームワーク . 14Jetty: サーブレットコンテナ 6. 1 5HSQLDB:ピュアJavaなデータベース . 0. 1.8
  • 10. 各APIのバージョン1.0.5 → 現在hibernate-3.2.6.ga → hibernate-3.3.1jetty-6.1.12 → jetty-6.1.14spring-2.5.6 → spring-2.5.6sitemesh-2.3 → sitemesh-2.4hsqldb-1.8.0.5 → hsqldb-1.8.0.5groovy-all-1.5.6 → groovy-all-1.6.3-SNAPSHOT
  • 11. 長くなるので、一気に紹介。
  • 12. GORM スタンドアロンでGORMが使用可能!   Spring MVCでのサンプル、GRAILS_HOME/samples/petclinic-mvcを参照 ty E nti applicationContext.xmlにデータソースと、<gorm:sessionFactory/>の定義 nce. si ste<gorm:sessionFactory base-package="org.grails.samples" . per data-source-ref="dataSource" ils tgra y message-source-ref="messageSource"> im por y { gr oov it on . <property name="hibernateProperties"> t rs @En s Pe name son <util:map> s Per cla tring <entry key="hibernate.hbm2ddl.auto" S value="update"/> ... </util:map> } </property></gorm:sessionFactory> GORMイベント - イベントbeforeInsert,beforeUpdate,beforeDeleteに、さらにafterInsert, afterUpdate , afterDeleteが追加された。 :String] any = [name 他に、 基本型(String,Integer)、 Enum でのコレクション。 static hasM .read( 1) 読み取りのみのオブジェクト取得。ソートのデフォルト値の設定。 def b ook = Book バッチフェッチ。 static m apping = static mapping = { sort "na { ダイナミックファインダの向上。 batchSize 15 me" books so rt:"titl joinTable! } } e" generatorの指定 static mapping = { id generator:"org.hibernate.id.enhanced.SequenceStyleGenerator", params:[sequence_name:item_id_seq,initial_value:1000,increment_size:1] }
  • 13. GSP(Groovy Server Pages)GSPでのJSPタグライブラリのサポート <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> JSPタグを使う! <fmt:formatNumber value="${10}" pattern=".00"/> メソッドのように使う! ${fmt.formatNumber(value:10, pattern:".00")} _tableRow.gspの中身テンプレートネームスペース <tr> <td class="prop">${label}</td> <td class="value">${value}</td> </tr> ネームスペースtmpl+ _ を無くしたファイル名で呼び出す。 <tmpl:tableRow label="one" value="two" />Server Side Includes - <g:include>タグで別のコントローラ、アクションを呼び出せる。 <g:include controller="book" action="list"/> コントローラあるいはタグライブラリでは、メソッドとして呼出も可能! def content = include(controller:"book", action:"list")パフォーマンスの改善
  • 14. データバインディングサブセットプロパティ 今までは、以下の方法で全プロパティがバインドされました。 person.properties = params サブセットプロパティの対応で、指定した項目のみバインドも! person.properties["firstName","lastName"] = params 同じ方法でアクセスも可能! person.properties["firstName","lastName"].each { println it }コレクション型への対応 <g:textField name="books[0].title" value="the Stand" /> <g:textField name="books[1].title" value="the Shining" /> <g:textField name="books[2].title" value="Red Madder" /> 自動的に収集してまとめてくれます。
  • 15. コントローラ関連RESTfulマッピングの指定方法の向上  "/books"(resource:"book") の指定で、  GET, PUT, POST, DELETEを自動的に、 アクション"show", "save", "update", "delete"に設定多重サブミット対策フォームに、<g:form useToken="true">を指定すると、コントローラ内で、withFormを使用してフォームの多重サブミットを判別できるようになった。 withForm { // 正常なリクエスト }.invalidToken { // ダブルクリックしたな?リクエストのフォワード } forward controller:"home", action:"index"エラーハンドルの宣言 UrlMappingsにエラーハンドルの宣言が可能に。 "500"(controller:"errors", exception:IllegalArgumentException)
  • 16. Scaffoldingダイナミックスカッフォルディングとテンプレートダイナミックスカッフォルディング時のテンプレートは、grails install-templates コマンドでインストールされたテンプレートを使用するようになった。ダイナミックなのに微調整できる!スカッフォルドでのM-to-M対応!
  • 17. その他Maven統合Ant + Ivy統合 - Grailsが生成するAntのbuild.xmlとivy.xmlで、Grailsがインストールされていない環境(CIサーバ等)でもビルド可能。Log4j DSLEnvironment(環境) 、Metadata(メタ情報) API MENT EL OP nme nt.DEV nv iro rrent ls. util.E tad ata.cu grai .u til.Me e ta = grails ationNam c de f metada data.appli eta pri ntln m非インタラクティブモードBeanBuilderでSpringネームスペースに対応テストフレームワーク - Testingプラグインは、本体に統合!Encrypted Data Sources - データソースパスワードの暗号化
  • 18. まだまだ有ります。 ここからは、チーム開発に便利!?な・・
  • 19. BuildConfig.groovyプロジェクトのビルドに関連する情報をカスタマイズできる定義ファイルGrails-1.0.x系では、Grailsのコンパイルされたクラスなどは、$USER_HOME/.grails/<バージョン>/以下に固定されていましたが、Grails-1.1からは指定変更可能になりました。ファイルの設置場所$PROJECT_HOME/grails-app/conf/BuildConfig.groovy中はこんな感じ↓ grails.project.plugins.dir="work_tmp/plugins" grails.project.work.dir="work_tmp/work" grails.plugin.location."feeds"="./plugins/feeds-1.4"
  • 20. BuildConfig定義できる内容※主な項目のみgrails.project.work.dir プロジェクトの作業ディレクトリ (このディレクトリ以下に classes,resources,plugins等が配置される) デフォルト:$USER_HOME/.grails/<バージョン>/projects/<プロジェクト名>/作業ディレクトリ以下を個別に指定も可能grails.project.plugins.dir プラグインのディレクトリ。 grails-1.0.xでの、$PROJECT_HOME/plugins デフォルト:$USER_HOME/.grails/<バージョン>/projects/<プロジェクト名>/pluginsgrails.project.test.reports.dir テストリポート書きだし先。grails.project.class.dir クラスの書きだし先。
  • 21. 何でBuildConfigで設定変える必要があるの?個人的な意見・・・。grails.project.class.dirのように、コンパイルクラスを置く場所はよいとして、Grails-1.1からプラグインの場所が変わってしまったので、Grails-1.0.xを使っていたユーザには、プラグインのディレクトリが近くにいないのは・・・・。で、 grails.project.plugins.dirで場所を変更すると、プラグインの場所が近くで管理できるのでわかりやすい。ビルドサーバなどでの事情もあるし! 変な所にファイル置かれても・・ じゃあ、変えられればOKでしょ! 管理できるのは良いこと!
  • 22. プラグイン個別のパス指定プラグインを個別に指定することもできます。grails.plugin.location."ext"="./plugins/ext-0.1"grails.plugin.location."form-maker"="./plugins/form-maker-0.1"grails.plugin.location."rhino"="./plugins/rhino-0.1.1"grails.plugin.location."waku-script"="./plugins/waku-script-0.2-SNAPSHOT"grails.plugin.location."yui"="./plugins/yui-2.6.0"grails.plugin.location."resources"="./plugins/resources-0.1"grails.plugin.location."taggin"="/works/experiment/grails-taggin/trunk"プラグイン開発に便利! ーが ! ンバ いね ムメ て良 チー なく 間 違え
  • 23. どの辺がチーム開発? で、ここで強引に プラグインの話!
  • 24. Grailsプラグインとは?自分のプロジェクトに便利な拡張機能を追加できる 公式プラグインも有ります!ユーザ認証機能とか、メールとか、コマンド install-pluginで簡単に追加できるそもそもGrails自身がプラグインの集合体!通常のGrailsプロジェクトと構造が同じ! ∼GrailsPlugin.groovyファイルの有無詳しくは!
  • 25. ん?各機能をプラグイン分けすると、開発を分担できそうだ! プラグインA インストール (プロジェクトの一部の機能) プラグインB インストール (プロジェクトの一部の機能) メインプロジェクト グラフ機能プラグイン インストール (今後も再利用できそうな機能) ユーザ認証プラグイン インストール (公式のプラグイン+カスタマイズ)この辺がチーム開発!+再利用性!
  • 26. 前から有るのに、何故いまさら主張するの?Grails-1.0.xでの問題点 他のメンバーがさわってしまったりして・・・ すぐさわれるので、ついカスタマイズ・・・ プラグインの派生が・・・
  • 27. EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY 中身が変わってるかもね!ENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EM EMERGENCYENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EM EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCYENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EM EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCYENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EM EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCYENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EM 管理しにくい! EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCYENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY EM EMERGENCY オリジナルかわからないね! EMERGENCY EMERGENCY EMERGENCY EMERGENCY EMERGENCY
  • 28. そこで!
  • 29. Grails-1.1からの、プラグインの新機能グローバルプラグイン複数のプラグインリポジトリ他動的なプラグイン自動解決 (Automatic Transitive Plugin Resolution)プラグインでのモジュール式アプリケーション開発プラグインスコープと環境定義
  • 30. グローバルプラグイン"-global"オプションを指定することによって、プラグインはグローバルプラグインとして管理されます。インストールされたプラグインは、同じ場所に保管されて、一度インストールすれば、同じバージョンのGrailsで他のアプリケーション開発するときは再度インストールすることなく使用することができます。grails install-plugin acegi -global
  • 31. グローバルは、必ず毎回とりこまれる!?有る意味便利だけど... ・・・物によっては不便!? orz
  • 32. そんなあなたにこんな新機能!プラグインでのモジュール式アプリケーション開発他動的なプラグイン自動解決(Automatic Transitive Plugin Resolution)複数のプラグインリポジトリ
  • 33. プラグインでのモジュール式アプリケーション開発Grails-1.1からプラグインは基本的にapplication.propertiesにメタ情報で管理されます。 app.version=0.1 plugins.acegi=0.5.1 app.servlet.version=2.4 ン app.grails.version=1.1-SNAPSHOT 名= バージョ plugins.hibernate=1.1-beta3 s.プ ラグイン app.name=relationsample pluginプラグインの追加削除、バージョン変更は、プロジェクトのapplication.propertiesの内容を変更するだけでよいのです。これで、他のチームメンバーへのプラグイン変更通知も楽々。 リポジトリに投げれば
  • 34. しかも!
  • 35. 他動的なプラグイン自動解決他動的なプラグイン自動解決 (※仮翻訳)(Automatic Transitive Plugin Resolution)application.propertiesの情報を元に、プラグインリポジトリから、自動的にバージョン確認して、インストール、アンインストールを行ってくれます。 但し、run-appを2回! ーが ! ンバ いね ムメ て良間違った操作を防げます! チー なく 間 違え
  • 36. ¿E ld¿これって、 ep ó sit公式プラグインリポジトリの osプラグインにしか ólo対応していないんぢゃん?¿! ofi c ial ?
  • 37. 複数のプラグインリポジトリ Grails-1.1から独自のプラグインリポジトリを設定するこ とができるようになりました。 設定方法 USER_HOME/.grails/settings.groovy 又は、 grails-app/conf/BuildConfig.groovyに情報定義。 例えば、チームのプラグインリポジトリに使用するSVN のUrlが、"http://127.0.0.1/gp"だとしたら grails.plugin.repos.discovery.local="http://127.0.0.1/gp" grails.plugin.repos.distribution.local="http://127.0.0.1/gp"grails.plugin.repos.discovery.リポジトリ名称="リポジトリへのHttpベースのURL"grails.plugin.repos.distribution.リポジトリ名称="リポジトリへのHttpベースのURL"
  • 38. 複数のプラグインリポジトリ独自のプラグインリポジトリ設定をすることによって、プラグイン関連のコマンドlist-plugins,install-pluginで設定したプラグインリポジトリも同時に参照してくれます。個別に参照する場合は、以下のように設定したリポジトリ名称を指定します。grails list-plugins -repository=リポジトリ名称
  • 39. 独自のプラグインリポジトリに プラグインをリリースプラグインプロジェクトディレクトリでrelease-pluginに-repository=対象リポジトリ名称を指定して実行。 grails release-plugin -repository=リポジトリ名称 以下の内容を行ってくれます。1. プラグインのパッケージング2. プラグインリポジトリへのプラグインの追加  (grails-プラグイン名の階層に、tags trunkを追加)3. プラグインのバージョンを自動でタグ切り4. プラグインリポジトリにある、プラグイン管理の  .plugin-meta/plugins-list.xmlを更新
  • 40. チーム用のプラグインリポジトリ!
  • 41. Grails-1.1はいろいろ、便利。
  • 42. 元々 プラグインA インストール (プロジェクトの一部の機能) プラグインB インストール (プロジェクトの一部の機能)メインプロジェクト グラフ機能プラグイン インストール (今後も再利用できそうな機能) ユーザ認証プラグイン インストール (公式のプラグイン+カスタマイズ)
  • 43. プラグイン これから! チーム用プラグインリポジトリ Grails公式プラグイン チーム用リポジトリ プラグインプラグイン自動解決 メタ情報で自動管理 独自プラグインリポジトリで管理 メインプロジェクト プラグインB (プロジェクトの一部の機能) 使用する プラグインの情報を プラグインA 定義 (プロジェクトの一部の機能) チェックアウト グラフ機能プラグイン (今後も再利用できそうな機能) チームメンバー ユーザ認証プラグイン (公式のプラグイン+カスタマイズ) プラグイン自動解決
  • 44. まとめapplication.propertiesにプラグイン情報を保持するため、チームメンバー間でのプラグインバージョン管理が楽に!BuildConfig.groovyで、開発時のビルド場所や、プラグイン情報をまとめやすくなった。 見えないゴミ減る! プラグイン開発時のソース分けが以前より楽に!開発プロジェクト内容の切り分けをプラグイン別にし、チーム用プラグインリポジトリを活用することで、開発した内容をプラグインとしての再利用が期待できる!
  • 45. Grails-1.1.1
  • 46. Grails 1.1.1GAE/Jの対応 試したから、ブログみてね!Grails-1.1のバグフィックス&機能向上 250件くらい!Groovy 1.6.3 ぉぉ!
  • 47. Q&A
  • 48. HQL派?Criteria派?
  • 49. ROOは試しましたか?
  • 50. 予告!
  • 51. 次回 まだ未定ですが…ビーンビルダー!?