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

Chr*_*att 9 django less django-compressor

这是场景:

我正在运行Django 1.3.1,使用静态文件和django-compressor(最新稳定版)来编译LESS文件.

我有一个"资产"目录,它挂在静态文件中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"
Run Code Online (Sandbox Code Playgroud)

(即,基于URL,从上升到水平/static/myapp/css/static/,然后遍历下入/static/css/lib.less).

但是,这不起作用,我已经尝试了几乎我能想到的URL和物理路径的所有组合,并且所有这些组合都FilterError在模板中给我,因为无法找到要导入的文件.

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

Chr*_*att 11

在精确跟踪django压缩器源中错误的来源之后.事实证明,它直接从shell传递.这让我想要删除所有变量,并且只是试图让lessc编译器解析文件.

原来它想要从物理文件系统路径导入从源文件到文件的相对路径.所以我不得不一直回到我的身边<project_root>然后assets/css/lib.less从那里引用.最终工作的实际导入是:

@import "../../../../assets/css/lib.less"
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,lessc 接受绝对文件系统路径(即/path/to/project/assets/css/lib.less).我不知道为什么.

更新(02/08/2012)

当我最终将我的代码推送到我的临时环境并运行时,有一个完整的"DUH"时刻collectstatic.我用的是@import路径发展工作得很好,因为这是该文件的物理路径,然后,但一旦collectstatic做它的事,一切都围绕移动和相对<project_root>/static/.

我玩弄了使用符号链接来尝试匹配collectstatic@import 前后路径的想法,但我认为从长远来看,这太复杂和脆弱了.

所以...我崩溃并将所有LESS文件移到一起<project_root>/assets/css/,并合理化将LESS文件移出应用程序,因为因为它们与项目级文件绑定以便运行,所以它们本身就是项目级别的他们自己.


wji*_*jin 5

我也处于同样的困境,这就是我为最新版本的压缩器和 lessc 与静态文件集成而提出的想法。希望这能帮助其他人

据我从实验中可以看出,lessc没有绝对或相对路径的概念。相反,它似乎维护一个搜索路径,其中包括当前目录、less 文件的包含目录以及通过以下方式传递给它的任何内容--include-path

所以在我的压缩机配置中我把

COMPRESS_PRECOMPILERS = (
    ('text/less', 'lessc --include-path=%s {infile} {outfile}' % STATIC_ROOT),
)
Run Code Online (Sandbox Code Playgroud)

比如说,跑步后collectstatic我有引导生活在

STATIC_ROOT/bootstrap/3.2.0/bootstrap.css. 
Run Code Online (Sandbox Code Playgroud)

然后从任何 less 文件中,我现在可以写

@import (less, reference) "/bootstrap/3.2.0/bootstrap.css"
Run Code Online (Sandbox Code Playgroud)

这允许我在我的任何 less 文件中使用引导类作为 less mixin!

每次更新 less 文件时,我都必须运行collectstatic 将它们聚合到本地目录中,以便压缩器可以提供less正确的源文件来处理。否则,压缩机会顺利处理一切。您还可以使用collectstatic -l符号链接,这意味着您只需要在添加新文件时收集文件。

我正在考虑实现一个管理命令来平滑开发过程,无论是每次重新加载服务器时调用子类,还是runserver在更新内容时直接使用调用。collectstaticdjango.utils.autoreloadcollectstatic

编辑(2014/12/01):我上面概述的方法需要本地静态根。我在生产环境中使用远程存储和离线压缩,因此部署需要几个额外的步骤。除了调用collectstatic将静态文件同步到远程存储之外,我还调用collectstatic使用本地存储的不同 django 配置文件。在本地收集文件后,我可以调用“压缩”,将其配置为将结果文件上传到远程存储,但在本地存储中查找源文件。