質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

Q&A

解決済

2回答

985閲覧

Play Framework 2.7の本番環境で公開アセットからファイルを直接読み込みたい

wat77

総合スコア12

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

0グッド

0クリップ

投稿2021/06/22 07:55

編集2021/06/23 01:38

前提・実現したいこと

Play Framework 2.7 で本番環境(sbt compile stage)にした場合、開発環境では存在する公開アセット(Publicフォルダ)がWebJarsの機能でjarファイル内にまとめられているようなのですが、そこからファイルを直接読み込む方法を教えてください。
※conf/routesの「controllers.Assets.at(file)」のように開発環境でも本番環境でも同じ処理で取得する方法があれば、教えて欲しいです。

発生している問題・エラーメッセージ

開発中(sbt run)のときは普通にPublicフォルダが存在しているので、次のような処理で読み込めますが、本番環境ではファイルが見つからないエラーが出ます。

scala

1val html = Source.fromFile("public/ui/index.html").mkString

試したこと

  • 本番環境のルートにpublicフォルダをコピー
  • 本番環境にはpublicフォルダが存在しないため、本番環境のルートに開発環境のpublicフォルダをコピー
  • binフォルダのbatファイルでカレントディレクトリを1階層上に調整

batch

1rem バッチの上の方に追加 2cd /d "%~dp0" 3cd /d ..

一応、上記処置をすれば、本番環境でも無理やりな感じで動きますが、きれいなやり方が知りたいです。

2021-06-23補足追記

図1.本番環境用に「sbt compile stage」を実行した際の{プロジェクト}/target/universal/stage フォルダ
※publicが見当たりません
イメージ説明

図2.{プロジェクト}/target/universal/stage/lib/{アプリケーション名}-assets.jarを圧縮展開したフォルダ
※この中に公開アセットファイルが入っているようです。
イメージ説明

補足情報(FW/ツールのバージョンなど)

OS : Windows 10 Pro x64
FW : Play Framework 2.7.2
Java : 1.8.0_192(64-Bit Server VM)
Scala : 2.12.8
sbt : 0.13.11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

結局、本番環境で公開アセットから直接リソースを読み込む方法はわからなかったのですが、def vueappでMode.Dev以外の場合はAssets.atを呼び出すように修正したところ、目的の動作になりましたので、一応これで解決とします。

scala

1package controllers 2 3import com.mohiva.play.silhouette.api.actions.SecuredRequest 4import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository 5import com.mohiva.play.silhouette.api.{LogoutEvent, Silhouette} 6import javax.inject.Inject 7import models.services.IndexRenderService 8import play.api.{Environment, Mode} 9import play.api.http.ContentTypes 10import play.api.i18n.I18nSupport 11import play.api.libs.ws.WSClient 12import play.api.mvc._ 13import utils.auth.DefaultEnv 14 15import scala.concurrent.{ExecutionContext} //, Future} 16 17/** The basic application controller. 18 * 19 * @param components The Play controller components. 20 * @param silhouette The Silhouette stack. 21 */ 22class ApplicationController @Inject() ( 23 components: ControllerComponents, 24 silhouette: Silhouette[DefaultEnv], 25 environment: Environment, 26 ws: WSClient, 27 indexRenderService: IndexRenderService, 28 authInfoRepository: AuthInfoRepository, 29 myAssets: controllers.Assets 30)(implicit ec: ExecutionContext) 31 extends AbstractController(components) 32 with I18nSupport { 33 34 /** @return vuejs index.html page with CSRF set 35 */ 36 def vueapp(path: String) = silhouette.UserAwareAction.async { implicit req => 37 environment.mode match { 38 case Mode.Dev => 39 fetchWebpackServer(path) 40 case _ => 41 //renderIndexPage() 42 myAssets.at(path = "/public/ui", "index.html")(req) 43 } 44 } 45 46 /** Handles the Sign Out action. 47 * 48 * @return The result to display. 49 */ 50 def signOut = silhouette.SecuredAction.async { 51 implicit request: SecuredRequest[DefaultEnv, AnyContent] => 52 silhouette.env.eventBus.publish(LogoutEvent(request.identity, request)) 53 silhouette.env.authenticatorService.discard(request.authenticator, Ok) 54 } 55 56 /** Retrieves resource from WebPack server. CSRF token will be injected to HTML files. 57 * 58 * @param path HTTP resource path 59 * @param request HTTP request 60 * @return 61 */ 62 private def fetchWebpackServer( 63 path: String 64 )(implicit request: RequestHeader) = { 65 ws.url(s"http://localhost:8080/$path").get().map { r => 66 if (r.contentType.equalsIgnoreCase(HTML(Codec.utf_8))) { 67 val html = r.bodyAsBytes.utf8String 68 Ok(indexRenderService.setCsrfToken(html)).as(ContentTypes.HTML) 69 } else { 70 new Status(r.status)(r.bodyAsBytes).as(r.contentType) 71 } 72 } 73 } 74 75 76 ///** Renders index page by injecting CSRF token 77 // * 78 // * @param request HTTP request 79 // * @return 80 // */ 81 //private def renderIndexPage()(implicit request: RequestHeader) = { 82 // Future.successful { 83 // val html = indexRenderService.render( 84 // Some( 85 // "Scala PlayFramework authentication and user management sample using Silhouette VueJs" 86 // ) 87 // ) 88 // Ok(html).as(ContentTypes.HTML) 89 // } 90 //} 91 92 93} 94

投稿2021/06/28 06:24

wat77

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

"public/ui/index.html"はシステムのrootから相対パスになっていますが、
今回のケースで使いたいのはproject rootからの相対パスです。
このあたりを参考に試してみてください。

投稿2021/06/22 14:32

編集2021/06/22 14:33
rysh

総合スコア874

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wat77

2021/06/23 01:44

返信ありがとうございます。 「試したこと」の補足に追記したのですが、「sbt compile stage」で本番環境デプロイ用のファイルを生成すると、その中にはpublicフォルダはなく、公開アセットはjarファイルの中に圧縮されているようでして、単純なパス調整ではうまくいきませんでした。
rysh

2021/06/23 13:25

プロジェクトそのままgithubで公開するか圧縮してどこかにアップロードできません?
wat77

2021/06/24 07:01

元々はsilhouetteの公式のv7.0向けサンプル「silhouette-vuejs-app」を元にプロジェクトを作成しようとしてたのですが、説明どおりの手順を行ってるはずなのに、本番環境向けで動かなかったため、仕方がないので、処理を変更しようかと思い、四苦八苦してました。 以下のソースの16行目が本番環境でうまく動かない部分になります。 https://github.com/SunPj/silhouette-vuejs-app/blob/master/app/models/services/IndexRenderService.scala 環境構築だけして、まだ全然コーディングしてませんので、上記からダウンロードしたコードでこちらの環境と同じになるかと思います。 本家に質問した方がいい案件かなとも思いながら、こちらに質問させていただきました。すみません。
kiino

2021/06/26 05:54

横からですいません。 該当のServiceクラスは Mode.Dev 、つまり開発環境のローカル起動の場合のみを想定している実装なのではないでしょうか。 https://github.com/SunPj/silhouette-vuejs-app/blob/09d159cc349c9893a4dc913109049d5d6b04bfea/app/controllers/ApplicationController.scala#L36-L37 なので本番環境で動かないのは仕方ないといいますか、想定動作のような気がします 本番環境での動作環境設定を dev 以外にする。とすれば該当エントリーポイントからの実行が可能になるのではないでしょうか
wat77

2021/06/28 00:01

ソースのご確認、ありがとうございます。 https://github.com/SunPj/silhouette-vuejs-app/tree/09d159cc349c9893a4dc913109049d5d6b04bfea#running-in-production 上記Readme.mdに本番環境(製品版)の実行方法が記載されていまして、そちらで動作させたときに問題が出ています。(開発時の実行方法では問題ありません) loggerを追加して確認しましたが、Mode.Devの方は通っていません。 本番環境(製品版)の場合、以下の順に処理されてます。 ①https://github.com/SunPj/silhouette-vuejs-app/blob/09d159cc349c9893a4dc913109049d5d6b04bfea/app/controllers/ApplicationController.scala#L39 ②https://github.com/SunPj/silhouette-vuejs-app/blob/09d159cc349c9893a4dc913109049d5d6b04bfea/app/controllers/ApplicationController.scala#L80 ③https://github.com/SunPj/silhouette-vuejs-app/blob/09d159cc349c9893a4dc913109049d5d6b04bfea/app/models/services/IndexRenderService.scala#L16 (ここでエラー)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問