2012-01-24 65 views
9

這裏是場景:我的LESS @import路徑應該是什麼?

我正在運行Django 1.3.1,利用staticfiles和django-compressor(最新穩定版)來編譯LESS文件。

我的影片勾搭成staticfiles與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和物理路徑的組合,我可以想到它們全都給了我s在模板中,由於無法找到文件來導入。

任何人都有什麼想法的實際進口路徑應該是什麼?

回答

11

在確定錯誤來自django壓縮機源的確切位置後。事實證明,它直接從shell中傳遞。其中提示刪除所有變量,並且字面上只是試圖讓lessc編譯器解析文件。

原來它想從源文件在物理文件系統路徑方面要導入的文件的相對路徑。所以我不得不退回到我的<project_root>,然後從那裏參考assets/css/lib.less。終於工作的實際進口爲:

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

什麼是非常奇怪的是,雖然lessc將接受一個絕對的文件系統路徑(即/path/to/project/assets/css/lib.less)。我不知道爲什麼。

UPDATE(02/08/2012)

有一個完整的「杜」那一刻,我終於把我的代碼,我的臨時環境就跑collectstatic。我用的是@import路徑發展工作得很好,因爲這是對文件然後的物理路徑,但一旦collectstatic做這件事,一切都圍繞移動和相對<project_root>/static/

我玩弄了使用符號鏈接嘗試匹配前後路徑的想法,但是我認爲從長遠來看這太複雜和脆弱了。

SO ...我分手並將所有LESS文件一起移動到<project_root>/assets/css/之下,併合理地將LESS文件移出應用程序,因爲由於它們綁定到項目級文件以便運行,它們本身就是項目級別的。

+0

Blah!我想我必須這樣做...我的本地開發編譯器不知道django的靜態文件..所以,即使我修改了我的工作流以在本地運行collectstatic,我的編譯器也會修改/ static/dir中的文件。有點不幸。你最終仍然使用靜態文件的一切,但CSS? –

+0

我最終將我的較少文件移動到'assets/less/products.less'並刪除了應用文件夾結構。一個擁有所有資產的應用程序感覺很乾淨,太糟糕了,它消失了! –

+1

也許我錯過了一些東西,但爲什麼不只是配置'lessc'的幾個包含路徑,使它不必使用這些相對路徑?它可能不是理想的或命名空間,但你的解決方案也不是。 – tmandry

4

我有點相同的結合,這是我想出了最新版本的壓縮機和lessc與靜態文件集成。希望這會幫助其他人出局

據我所知,從實驗中可知,lessc沒有絕對或相對路徑的概念。相反,它似乎保持搜索路徑,包括當前目錄,少的文件所在目錄,不管你通過--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" 

它允許我在任何較少文件中使用引導類作爲較少的mixin!

每次我更新一個較少的文件時,我必須運行collectstatic將它們聚合到一個本地目錄中,以便壓縮器可以給less正確的源文件進行處理。否則,壓縮機可以順利處理所有事情您也可以使用collectstatic -l進行符號鏈接,這意味着您只需在添加新文件時收集這些文件。

我正在考慮實施的管理命令來消除發展過程中,要麼子類runserver每個服務器重新加載時間打電話collectstatic,或者使用直接django.utils.autoreload打電話collectstatic當事情被更新。

編輯(2014/12/01):我的方法如上所述需要一個本地靜態根。我在生產環境中使用具有脫機壓縮功能的遠程存儲,因此部署需要幾個額外的步驟。除了調用collectstatic以將靜態文件同步到遠程存儲器之外,我還撥打collectstatic以使用不同的使用本地存儲的django配置文件。在本地收集文件後,我可以調用'compress',將其配置爲將結果文件上傳到遠程存儲,但在本地存儲中查找源文件。

相關問題