如何使用环中间件发布目录?

时间:2016-05-10 20:32:28

标签: clojure qooxdoo compojure ring

我正在尝试将Clojure + Compojure + Ring与qooxdoo JS库结合使用。这实际上进展顺利,但qooxdoo以两种模式运行" build" (这对我有用)和"来源" (不太好)。在后一种情况下,qooxdoo生成的JS实际上将引用(好吧,使用相对地址../../ ..)硬编码回qooxdoo安装,并且在运行时它要求像:

http://localhost:3000/opt/qooxdoo-5.0.1-sdk/framework/source/class/qx/bom/client/OperatingSystem.js

...因为我在/opt/qooxdoo-5.0.1-sdk下安装了库。

严重的健全性检查:如果我在浏览器中直接打开index.html,它可以正常工作。所以我似乎只需要弄清楚如何在/ opt库安装下提供静态文件。

我已经尝试过ring.middleware.file中的wrap-file,因为这听起来像我想要的但是无论我给它做什么路径我都会得到数百个404,因为它试图从已安装的库中单独获取每个框架文件

我可以在" build" (qooxdoo将我用wrap-resource服务的单个缩小的.js拼凑在一起)但有时我需要在源模式下运行才能找到JS错误。

我错过了一些简单的东西吗?

4 个答案:

答案 0 :(得分:2)

处理此问题的正确方法是配置Qooxdoo告诉它您要使用哪些URI - 默认情况下,源构建只使用相对路径,但您可以通过编辑config.json轻松覆盖它。

在你的config.json中,你将有一个“jobs”部分,其中包含一个“库”部分,包含一个“库”数组 - 你的应用程序是一个库,Qooxdoo就像任何贡献一样,所以它看起来像这样:

"jobs" : {
   "libraries" : {
        "=library" : [ {
            "manifest" : "${QOOXDOO_PATH}/framework/Manifest.json"
        }, {
            "manifest" : "Manifest.json"
        }
   },

每个“库”对象都可以有一个“uri”属性,所以对于你的例子,你可能想要这样的东西:

"jobs" : {
    "libraries" : {
        "=library" : [ {
            "manifest" : "${QOOXDOO_PATH}/framework/Manifest.json",
            "uri" : "/opt/qooxdoo-5.0.1-sdk"
        }, {
            "manifest" : "Manifest.json"
        }
    },

答案 1 :(得分:0)

确实很简单:( wrap-file“/”)

在开发/源模式下,qooxdoo在安装目录下工作,而不是将代码拉入我的本地树,并通过硬编码解析为绝对/ opt / qooxdoo-etc路径的相对路径来实现。

这看起来像服务器的相对“opt / qooxdoo ...”文件请求,所以我不得不提供root(“/”)作为搜索目录。

答案 2 :(得分:0)

(wrap-file "/")是一个严重的安全问题,因为您为所有人提供了根目录。

您可以做的是创建专用目录来为您的静态文件提供服务,并从那里提供您的内容。

su
mkdir -p /var/clojure/static/opt
cd /var/clojure/static/opt
ln -s /opt/qooxdoo-5.0.1-sdk qooxdoo-5.0.1-sdk
chown -r YOUR-USER-ID /var/clojure/static/opt 

使用中间件:(wrap-file "/var/clojure/static")来提供文件。

答案 3 :(得分:0)

本手册中有一节介绍serving a source version through a web server的问题。

我猜您自己找到了基本的见解,Web服务器必须导出一个根,其中生成的加载器中使用的相对路径与该Web服务器下的URL路径匹配。 (这背后的理由是源版本直接从磁盘使用所有相关库中的所有JS文件。)

在最坏的情况下,可能意味着您需要从Web服务器导出文件系统根目录(“/”)。当你在本地开发机器上这样做时,这不应该是一个大问题。如果担心安全问题,您可能希望在/ home / kenny / devel / qooxdoo之类的无辜路径下收集qooxdoo环境,其中包含qooxdoo SDK,您的应用以及您可能正在使用的所有libs / contrib。

如果您按照上述链接,您还可以从qooxdoo工具链中找到一些帮助。例如。如果您运行generate.py source-httpd-config [*],它将告诉您本地磁盘上哪条路径是最接近的父目录,该目录将包含所有必需的库,即需要在Web服务器中导出以使源版本工作

或者,正如John所写,您可以通过Web服务器下的单个路径导出每个qooxdoo lib,然后告诉主应用程序在哪里找到它。您实际上可能需要提供类似http://localhost/libs/qooxdoo-5.0.1-sdk/framework的正确URL,而不仅仅是John建议的文件系统路径。还要记住,你必须到Manifest文件所在的目录(因此上面的路径以.../framework结尾)。请参阅此manual section进行深入研究。