9

这是场景:

我正在运行 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"

(即基于 URL,从 到 上/static/myapp/css/static/,然后向下遍历到/static/css/lib.less)。

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

任何人都知道实际的导入路径应该是什么?

4

2 回答 2

11

在准确追踪错误来自 django-compressor 源的位置之后。原来是直接从shell传过来的。这使我删除了所有变量,并试图让lessc编译器解析文件。

事实证明,它想要从源文件到要导入的文件的相对路径,就物理文件系统路径而言。所以我不得不一直退回到我的<project_root>,然后assets/css/lib.less从那里参考。最终起作用的实际导入是:

@import "../../../../assets/css/lib.less"

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

更新(2012 年 2 月 8 日)

当我最终将代码推送到暂存环境并运行collectstatic. 我使用的@import 路径在开发中运行良好,因为那是文件的物理路径但是一旦collectstatic完成,一切都会移动并相对于<project_root>/static/.

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

所以......我分解并将所有LESS文件一起移动到下<project_root>/assets/css/,并合理地将LESS文件移出应用程序,因为由于它们与项目级文件绑定以运行,它们本质上是项目级的他们自己。

于 2012-01-24T17:57:59.903 回答
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"

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

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

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

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

于 2014-09-19T08:03:44.633 回答