2

サブディレクトリ public を保持するリソース ディレクトリを使用するブート プロジェクトをセットアップしようとしています。後者には、たとえば、すべての Web 関連コンテンツ、コンパイルされた clojurescript などを含める必要があります。

これは、公開することを意図していないリソースを保持したい場合に適しています。

追加の public ディレクトリなしで実行すると、完全に機能します。追加のサブディレクトリを使用しようとすると、エラーが発生します。関連する構成は次のとおりです。

build.boot で:

(set-env! :resource-paths #{"resources"} ...)

...

(deftask dev
  []
  (comp
   (serve
    :handler 'myapp.server/handler
    :reload true
    :port 3000)
   (watch)
   (reload)
   (cljs-repl)
   (cljs)
   (target :dir #{"resources/public"})))

resources ディレクトリ内から:

bash-4.3$ tree
└── public
    ├── index.html
    └── js
        └── main.cljs.edn

一方、main.cljs.edn は次のようになります。

{:require [{{name}}.core]
 :compiler-options {:asset-path "js/main.out"}}

呼び出し時boot devに次のことが発生します: プロセスが手動で強制終了されるまで、ClojureScript はエラーでコンパイルを続けます。一部の相対パスに関連する再帰エラーのようです。

Compiling ClojureScript...
• public/js/main.js
Writing target dir(s)...
java.util.concurrent.ExecutionException: java.nio.file.NoSuchFileException: resources/public/public/public/js/main.out/goog/deps.js

一方、長く実行し続けると、public/public/public/..展開します。

これを修正できる提案はありますか?


アップデート

質問の更新版は次のとおりです。

次のリソース フォルダーの構造を考えてみましょう。

bash-4.3$ tree
└── private_file.txt
└── public
    ├── index.html
    └── js
        └── main.cljs.edn

そして、build.boot の次の部分:

   (set-env! :resource-paths #{"resources"} ...)

   (deftask dev
      []
      (comp
       (serve
        :handler 'myapp.server/handler
        :reload true
        :port 3000)
       (watch)
       (reload)
       (cljs-repl)
       (cljs)
       (target)))

'myapp.server/handler は、resources/public からファイルを提供するだけであることを認識しています (wrap-resourceまたは同等の構成要素によって実装されていresourcesます。後者はデフォルトで "private" に設定されています。

しかし、問題はさらに早い段階で発生します。リソースディレクトリ全体を実行すると、もちろんboot devターゲットディレクトリに再現されます。private_file.txt(これは意図された動作ですか? ファイルが非常に大きくなる可能性があり、ディスク容量の 2 倍を消費する可能性があることを意味します)

この時点で、 main 内の :asset-path がこれにどのように影響するかはわかりません。ここの例では、「js/main.out」のままにしていますが、これは間違っている可能性があります。

4

1 に答える 1

1

問題は、生成されたコードをソース ディレクトリに配置していることであり、ビルド タスクが生成中のファイルを消費し始めるため、ビルド タスクが混乱する可能性があることだと思います。犯人は次のとおりです。

(target :dir #{"resources/public"})

デフォルトのままにします:

(target :dir #{"target"})

これはちょうど

(target)

serve独自のリング ハンドラー ( ) を提供するタスクを使用し'myapp.server/handlerているため、クラスパス ("public") で正しいルート ディレクトリを指定することにより、ハンドラーがクラスパスからリソースを提供することを確認する必要もあります。おそらく、あなたはすでにring.middleware.resource/wrap-resourceそのように使用しています:

(wrap-resource handler "public")

最後はあなたのmain.cljs.ednファイルです。サーバー/ハンドラーによって提供されるJSファイルへの相対パスになる:asset-pathように設定するjs必要があります(からのファイルtarget/public/jsが提供されますhttp://localhost:xxxx/js)。

この設定により、ソース ファイル (html、css、および のその他のファイルresources/public) と、のようなタスクによって生成されたファイルがブラウザで利用できるようcljsになります。target/public

于 2016-08-10T19:44:17.730 に答える