我的LESS @import路径应该是什么?

时间:2012-01-24 15:20:14

标签: django less django-compressor

以下是该方案:

我正在运行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,因为它不能够找到要导入的文件。

任何人都有任何想法,实际的导入路径应该是什么?

2 个答案:

答案 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',将其配置为将结果文件上传到远程存储,但在本地存储中查找源文件。