play distの成果物に独自ディレクトリを含める方法

677 views
Skip to first unread message

樋口勝也

unread,
Jun 29, 2014, 10:16:46 PM6/29/14
to pla...@googlegroups.com
はじめまして、樋口と申します。

現在playFrameworkを用いてwebシステム開発を行っているのですが、下記内容がわからず足踏みしております。
よろしければご教示くださらないでしょうか。

○内容
∟play distの成果物に独自ディレクトリを含みたい

○詳細・背景
∟以下のディレクトリ構成における(/data/appendFIle)にブラウザからファイルをアップロードする機能を実装したのですが、
 distコマンドでの成果物に/data以下が含まれていないため、機能が動作しない状況となっています。

○ディレクトリ構成
/root
∟/app
  /test
  /conf
  /data(独自ディレクトリ)
  ∟/appendFile(独自ディレクトリ)
  /logs
  ……

○開発環境
OS:windows7
JDK:jdk1.7.0_55
言語:java
IDE:Eclipse Kepler Servie Release 2

○動作想定環境
OS:windos7以降

以上です。よろしくお願い致します。

Kenji Yoshida

unread,
Jun 29, 2014, 11:05:34 PM6/29/14
to pla...@googlegroups.com
playのversionはいくつでしょうか?

最新の2.3.1と仮定して、とりあえず丁寧に説明する時間ないので、大雑把にとっかかりだけ説明しておくと

distに含まれるものは mappings in Universal というkeyで設定されてるので

https://github.com/playframework/playframework/blob/2.3.1/framework/src/sbt-plugin/src/main/scala/PlaySettings.scala#L238
https://github.com/playframework/playframework/blob/2.3.1/framework/src/sbt-plugin/src/main/scala/PlaySettings.scala#L258
https://github.com/playframework/playframework/blob/2.3.1/framework/src/sbt-plugin/src/main/scala/PlaySettings.scala#L262-L287

この設定をいじればいけるはずです。


2014年6月30日 11:16 樋口勝也 <nekonote...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Playframeworkユーザー会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには play_ja+u...@googlegroups.com
> にメールを送信してください。
> このグループに投稿するには pla...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/play_ja からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

樋口勝也

unread,
Jun 30, 2014, 4:17:37 AM6/30/14
to pla...@googlegroups.com
Kenji Yoshida 様、ご回答ありがとうございます。

>playのversionはいくつでしょうか? 
こちらは2.2.3となっております。

現在、頂いた資料を参照し、以下のように修正しました。
その後distコマンドを実行したのですが、成果物に「/data」ディレクトリが含まれていない状況です。
どこが誤りか、ご指摘くださいませんでしょうか。

なお当方scala未経験であるため、かなり的外れな修正をしている可能性もあります。
「まだ触れるレベルにないな」と思った場合、「基礎からでなおしてこい!」と一喝していただけると幸いです。

○修正内容
∟「val dataDirectory <<= baseDirectory / "data"」を記述

∟「
    mappings in Universal <++= (dataDirectory) map {
      dataDirectory: File =>
        val dataDirectoryLen = dataDirectory.getCanonicalPath.length
        val pathFinder = dataDirectory ** "*"
        pathFinder.get map {
          dataFile: File =>
            dataFile -> ("data/" + dataFile.getCanonicalPath.substring(dataDirectoryLen))
        }
    },
」を記述

以上です。

2014年6月30日月曜日 12時05分34秒 UTC+9 Kenji Yoshida:

Takashi Kawachi

unread,
Jun 30, 2014, 4:39:03 AM6/30/14
to pla...@googlegroups.com
こんばんは。
吉田さんの URL を参考にして build.sbt に次のように書けばいけるのではと思います。

mappings in Universal ++= {
val dataDirectory = baseDirectory(_ / "data").value
val dataDirectoryLen = dataDirectory.getCanonicalPath.length
(dataDirectory ** "*").get.map { f: File =>
f -> ("data/" + f.getCanonicalPath.substring(dataDirectoryLen))
}
}

https://gist.github.com/tkawachi/5d7b999c3ca064ba1d39

build.sbt に書くので前後に空行をいれてください。

2014年6月30日 17:17 樋口勝也 <nekonote...@gmail.com>:
--
Takashi Kawachi
tkawachi at gmail.com

樋口勝也

unread,
Jun 30, 2014, 9:06:12 AM6/30/14
to pla...@googlegroups.com
Takashi Kawauchi様 ご回答ありがとうございます。

いただいたコードをbuild.sbtに記載して実行しましたが、成果物に/dataは含まれませんでした。
私の情報提供に不足があるかもしれません。
何か気がついた点がございましたら、ご指摘のほどよろしくお願いします。
build.sbtが3箇所ありましたので、それぞれに記述>distした場合のディレクトリ構造を以下に記述します。

dist成果物の初期状態におけるディレクトリ構造:
/root
∟/bin
∟/conf
∟/lib
∟/share

∟上記の箇所に、いただいたコードを記述した結果→ディレクトリ構造は初期状態と同様でした。

∟上記の箇所に、いただいたコードを記述した結果→ディレクトリ構造は初期状態と同様でした。

3:プロジェクトルートディレクトリ直下のbuild.sbt
-----------------------------------------------------------------------------------------------------------------------------------------
name := "NekonoteForSchool"

version := "1.0-SNAPSHOT"

libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache,
  filters
)

mappings in Universal ++= {
  val dataDirectory = baseDirectory(_ / "data").value
  val dataDirectoryLen = dataDirectory.getCanonicalPath.length
  (dataDirectory ** "*").get.map { f: File =>
    f -> ("data/" + f.getCanonicalPath.substring(dataDirectoryLen))
  }
}

play.Project.playJavaSettings

-----------------------------------------------------------------------------------------------------------------------------------------
結果→ディレクトリ構造は初期状態と同様でした。


2014年6月30日月曜日 17時39分03秒 UTC+9 Takashi Kawachi:

Kenji Yoshida

unread,
Jun 30, 2014, 9:19:17 AM6/30/14
to pla...@googlegroups.com
kawachiさんのコードであってると思います。(自分はmacですが出来ました)

> build.sbtが3箇所ありましたので、それぞれに記述>distした場合

という記述が若干気になったのですが、サンプルコードのディレクトリ構成(どこがルートディレクトリなのか)を勘違いしてるとかでしょうか?それとも、単に複数のサンプルコードのプロジェクトで試したということでしょうか?


考えられる原因は、
- サンプルコードのディレクトリ構成やsbt自体を理解してなくて、sbt起動ディレクトリ間違えてるなどの初歩的ミス
- dataディレクトリを試しに作っただけで、そこにファイルを入れてないから、空のディレクトリは含まれない
- kawachiさんのコードがwindowsでは動かない可能性
- もしくはplay2やそれが依存してるsbt-native-packagerのwindows特有のバグ
- build.sbtを変更したあと、プロジェクトをreloadしてないという単純なミス


などでしょうか



2014年6月30日 22:06 樋口勝也 <nekonote...@gmail.com>:

Takashi Kawachi

unread,
Jun 30, 2014, 9:38:59 AM6/30/14
to pla...@googlegroups.com
>> 2:https://github.com/playframework/playframework/blob/2.2.3/framework/skeletons/scala-skel/build.sbt#L10
>> ∟上記の箇所に、いただいたコードを記述した結果→ディレクトリ構造は初期状態と同様でした。

play.Project.playScalaSettings が mappings
を上書きしてしまうようで、私の示した設定はそのあとに書かないと効果がないようでした。

動く例をあげておきます。
https://github.com/tkawachi/mappingsTest
(きっとしばらくしたら消します)

2014年6月30日 22:18 Kenji Yoshida <6b656...@gmail.com>:
> このメールは Google グループのグループ「日本Playframeworkユーザー会」の登録者に送られています。

Kitora, Naoki

unread,
Jun 30, 2014, 10:05:19 AM6/30/14
to pla...@googlegroups.com
樋口さん

初めまして、木虎 (きとら) と申します。

dist で独自ディレクトリが含まれないとのことですが、アプリケーションの更新を考えると別にしておいた方が良いように思います。
でないと、アプリケーションを更新するたびに、前バージョンに含まれる data ディレクトリの内容を、新たにデプロイしたアプリケーションの
data ディレクトリに移動またはコピーするという手間が増えてしまわないでしょうか?
ディレクトリはサーバ側で用意して application.conf にそのパスを設定しておくというのが良いように思いますが、どうでしょうか?
# 何か勘違いしていたらすみません。
> --
> このメールは Google グループのグループ「日本Playframeworkユーザー会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには play_ja+u...@googlegroups.com
> にメールを送信してください。
> このグループに投稿するには pla...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/play_ja からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
Kitora, Naoki <naoki....@gmail.com>
twitter: http://twitter.com/kitora_naoki

樋口勝也

unread,
Jun 30, 2014, 10:28:22 AM6/30/14
to pla...@googlegroups.com
コード確認と原因の考察、ありがとうございます。

kawachi様に追加で教えていただき、なんとかdist成果物内に/data以下を含められました。

原因としてはずばり「- サンプルコードのディレクトリ構成やsbt自体を理解してなくて、sbt起動ディレクトリ間違えてるなどの初歩的ミス 」でした。
sbtや、playの設定ファイルに関する習熟がだいぶ不足しているようです。
もう一度入門書をはじからはじまで熟読することにします。

貴重なお時間をとっていただきまして、ありがとうございました!

2014年6月30日月曜日 22時19分17秒 UTC+9 Kenji Yoshida:

樋口勝也

unread,
Jun 30, 2014, 11:09:33 AM6/30/14
to pla...@googlegroups.com
設定したmaapingsを上書きしていたのですか・・・・・・そこまで考えていませんでした。

例示していただいたものを当方の環境に適用しましたところ、
しっかりと独自ディレクトリを含めたdist成果物が作成されました!

設定関係の方法をsbtの書き方も含めてフォローしなければなりませんね。

お世話になりました!ありがとうございました!

2014年6月30日月曜日 22時38分59秒 UTC+9 Takashi Kawachi:

Takashi Kawachi

unread,
Jun 30, 2014, 11:16:28 AM6/30/14
to pla...@googlegroups.com
> dist で独自ディレクトリが含まれないとのことですが、アプリケーションの更新を考えると別にしておいた方が良いように思います。

アプリケーションの動作に伴い変更されるファイルは更新時に上書きなどしてしまわないよう別ディレクトリにおいたほうがいいと私も思います。
# 若干意図が読み取れなかったので、とりあえず聞かれたことを答えましたが...

2014年6月30日 23:04 Kitora, Naoki <naoki....@gmail.com>:
> このメールは Google グループのグループ「日本Playframeworkユーザー会」の登録者に送られています。
> このグループから退会し、グループからのメールの配信を停止するには play_ja+u...@googlegroups.com にメールを送信してください。
> このグループに投稿するには、pla...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/play_ja からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。



--

樋口勝也

unread,
Jun 30, 2014, 11:18:02 AM6/30/14
to pla...@googlegroups.com
木虎様、ご意見ありがとうございます。

アプリケーション更新に伴って旧dataディレクトリから新dataディレクトリへのデータ移行が必要になるのではとのことですが、
単純に旧dataディレクトリを新dataディレクトリで上書きしても問題ないのではないでしょうか。

この場合、旧にあって新にないファイル・ディレクトリはそのまま残りますよね?

とはいえ、本来上書きする必要のないディレクトリを上書きするのは確かに怖いものがありますので、
ご提案していただいた方法での実装も考えてみます!
application.confのattachments.pathで保存箇所を指定するという認識でよいでしょうか。


2014年6月30日月曜日 23時05分19秒 UTC+9 kitora.naoki:
Reply all
Reply to author
Forward
0 new messages