以下是该方案:
我正在运行Django 1.3.1,使用静态文件,并使用django-compressor(最新稳定版)来编译LESS文件。
我有一个“assets”目录,它与STATICFILES_DIRS
(用于项目范围的静态资源)挂钩到静态文件中。在该目录中,我有一个“css”目录,其中包含一个包含LESS变量和mixins的“lib.less”文件。
因此,物理路径为<project_root>/assets/css/lib.less
,并在/static/css/lib.less
处提供。
在我的一个应用程序的静态目录中,我有另一个LESS文件,需要导入上面的那个。该物理路径为<project_root>/myapp/static/myapp/css/file.less
,它将在/static/myapp/css/file.less
处提供。
我的第一个想法是:
@import "../../css/lib.less"
(即根据网址,升级到/static/myapp/css
到/static/
的级别,然后向下移动到/static/css/lib.less
。
然而,这不起作用,我已经尝试了几乎我能想到的每个URL和物理路径的组合,并且所有这些组合都在模板中给了我FilterError
,因为它不能够找到要导入的文件。
任何人都有任何想法,实际的导入路径应该是什么?
答案 0 :(得分:11)
在django-compressor源中准确追踪错误的来源。事实证明,它直接从shell传递。这让我想要删除所有变量,并且只是试图让lessc
编译器来解析文件。
原来,它希望根据物理文件系统路径导入从源文件到文件的相对路径。所以我不得不一直回到我的<project_root>
,然后从那里引用assets/css/lib.less
。最终工作的实际导入是:
@import "../../../../assets/css/lib.less"
但奇怪的是,lessc 不接受绝对文件系统路径(即/path/to/project/assets/css/lib.less
)。我不确定为什么。
更新(02/08/2012)
当我最终将我的代码推送到我的暂存环境并运行collectstatic
时,有一个完整的“DUH”时刻。我使用的@import路径在开发中运行良好,因为那是文件然后的物理路径,但是一旦collectstatic
完成了它,就会移动所有内容并相对于{{ 1}}。
我玩弄了使用符号链接尝试匹配前后<project_root>/static/
@import路径的想法,但我认为从长远来看,这太复杂和脆弱了。
所以...我崩溃并将所有LESS文件移到collectstatic
下,并合理化将LESS文件移出应用程序,因为它们被绑定到项目级文件以便运行,他们本身就是项目层面的。
答案 1 :(得分:4)
我在同一个绑定中,这是我为最新版本的压缩器和lessc与静态文件集成而提出的。希望这会帮助其他人出去
据我所知,lessc
没有绝对或相对路径的概念。相反,它似乎维护一个搜索路径,其中包括当前目录,less文件的包含目录,以及通过--include-path
传递给它的任何内容
所以在我的压缩机配置中我把
COMPRESS_PRECOMPILERS = (
('text/less', 'lessc --include-path=%s {infile} {outfile}' % STATIC_ROOT),
)
说,跑完collectstatic
后,我有生活在
STATIC_ROOT/bootstrap/3.2.0/bootstrap.css.
然后从任何较少的文件,我现在可以写
@import (less, reference) "/bootstrap/3.2.0/bootstrap.css"
允许我在任何较少的文件中使用bootstrap类作为less mixins!
每次我更新一个less文件时,我都必须运行collectstatic将它们聚合在一个本地目录中,以便压缩器可以为less
提供正确的源文件。否则,压缩机可以顺利处理一切您还可以使用collectstatic -l
进行符号链接,这意味着您只需在添加新文件时收集这些文件。
我正在考虑实施一个管理命令来平滑每次重新加载服务器时要求runserver
子类调用collectstatic
的开发过程,或者直接使用django.utils.autoreload
来调用{事情更新时{1}}。
编辑(2014/12/01):我的方法如上所述需要本地静态根。我在生产环境中使用具有脱机压缩的远程存储,因此部署需要几个额外的步骤。除了调用collectstatic
将静态文件同步到远程存储之外,我还使用不同的使用本地存储的django配置文件调用collectstatic
。在本地收集文件后,我可以调用'compress',将其配置为将结果文件上传到远程存储,但在本地存储中查找源文件。