Django 我的LESS@import路径应该是什么?
以下是场景: 我正在运行Django 1.3.1,利用staticfiles和Django compressor(最新稳定版)编译更少的文件 我有一个“资产”目录,它与带有Django 我的LESS@import路径应该是什么?,django,less,django-compressor,Django,Less,Django Compressor,以下是场景: 我正在运行Django 1.3.1,利用staticfiles和Django compressor(最新稳定版)编译更少的文件 我有一个“资产”目录,它与带有staticfiles\u DIRS(用于项目范围的静态资源)的staticfiles挂钩。在那个目录中,我有一个“css”目录,在那个目录中有一个“lib.less”文件,其中包含的变量和mixin更少 因此,物理路径是/assets/css/lib.less,服务于/static/css/lib.less 在我的一个应用程
staticfiles\u DIRS
(用于项目范围的静态资源)的staticfiles挂钩。在那个目录中,我有一个“css”目录,在那个目录中有一个“lib.less”文件,其中包含的变量和mixin更少
因此,物理路径是/assets/css/lib.less
,服务于/static/css/lib.less
在我的一个应用程序的静态目录中,我有另一个更少的文件需要导入上面的文件。它的物理路径是/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和物理路径的几乎所有组合,所有这些组合都在模板中提供了filteerror
s,这是因为无法找到要导入的文件
任何人都知道实际的导入路径应该是什么吗?在精确跟踪django压缩程序源中的错误来源之后。事实证明,它是直接从外壳传递过来的。这迫使我删除了所有的变量,并试图让lessc
编译器解析文件
事实证明,它需要从源文件到要导入的文件的相对路径,即物理文件系统路径。所以我不得不回到我的
,然后从那里引用资产/css/lib.less
。最终有效的实际导入是:
@import "../../../../assets/css/lib.less"
但非常奇怪的是,LESC不接受绝对文件系统路径(即/path/to/project/assets/css/lib.less
)。我不知道为什么
更新(2012年8月2日)
当我最终将代码推送到我的登台环境并运行collectstatic
时,我有一个彻底的“DUH”时刻。我使用的@import路径在开发中工作得很好,因为当时它是文件的物理路径,但是一旦collectstatic
完成了它的工作,所有东西都会相对于/static/
移动
我曾想过使用符号链接来匹配collectstatic前后的导入路径,但我认为从长远来看,这太复杂和脆弱了
所以。。。我将所有较少的文件分解并移动到/assets/css/
下,并合理地将较少的文件移出应用程序,因为它们与项目级文件绑定,以便正常工作,它们本身就是项目级的。我也有同样的想法,这就是我为compressor和LESC的最新版本与StaticFile集成而提出的。希望这能帮助其他人
从实验中我可以看出,lessc
没有绝对或相对路径的概念。相反,它似乎维护了一个搜索路径,其中包括当前目录、less文件的包含目录,以及通过--include path
传递给它的任何内容
所以在我的压缩机配置中,我把
COMPRESS_PRECOMPILERS = (
('text/less', 'lessc --include-path=%s {infile} {outfile}' % STATIC_ROOT),
)
比如说,在运行了collectstatic
之后,我的bootstrap生活在
STATIC_ROOT/bootstrap/3.2.0/bootstrap.css.
然后从任何更少的文件,我现在可以写
@import (less, reference) "/bootstrap/3.2.0/bootstrap.css"
这使我能够在任何less文件中使用引导类作为less混入
每次更新更少的文件时,我都必须运行collectstatic将它们聚合到本地目录中,以便compressor可以为less
提供正确的源文件。否则,压缩机处理一切顺利。您还可以使用collectstatic-l
来进行符号链接,这意味着您只需要在添加新文件时收集文件
我正在考虑实现一个管理命令来简化开发过程,即在每次重新加载服务器时,子类runserver
调用collectstatic
,或者在更新时直接使用django.utils.autoreload
调用collectstatic
编辑(2014/12/01):如上所述,我的方法需要一个本地静态根。我在生产环境中使用带脱机压缩的远程存储,因此部署需要额外的几个步骤。除了调用collectstatic
将静态文件同步到远程存储之外,我还使用使用本地存储的不同django配置文件调用collectstatic
。在本地收集文件后,我可以调用“compress”,将其配置为将结果文件上载到远程存储,但在本地存储中查找源文件。Blah!我想我也得这么做。。。我的本地开发人员编译器不知道django的静态文件。。因此,即使我修改了工作流以在本地运行collectstatic,我的编译器也会修改/static/dir中的文件。。有点不幸。除了CSS之外,你还使用静态文件吗?我最终将我的less文件移动到资产/less/products.less,并删除了应用程序文件夹结构。一个拥有所有资产的应用程序感觉如此干净,真可惜它已经消失了!也许我遗漏了一些东西,但为什么不配置一些include路径来实现它,这样就不必使用那些相对路径呢?它可能不是理想的名称空间或名称空间,但也不是您的解决方案。