9

シナリオは次のとおりです。

Django 1.3.1 を実行し、staticfiles と django-compressor (最新の安定版) を使用して、とりわけ LESS ファイルをコンパイルしています。

STATICFILES_DIRS(プロジェクト全体の静的リソース用に)静的ファイルにフックされた「資産」ディレクトリがあります。そのディレクトリには「css」ディレクトリがあり、その中に LESS 変数と mixin を含む「lib.less」ファイルがあります。

したがって、物理パスは<project_root>/assets/css/lib.lessであり、 で提供され/static/css/lib.lessます。

アプリの静的ディレクトリの 1 つに、上記のファイルをインポートする必要がある別の 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)。

FilterErrorただし、それは機能しません。私が考えることができる URL と物理パスのほぼすべての組み合わせを試してみましたが、インポートするファイルを見つけることができなかったため、それらすべてがテンプレートで s を提供してくれました。

実際のインポートパスがどうあるべきか、誰にもアイデアがありますか?

4

2 に答える 2

11

django-compressor ソースのどこからエラーが発生したかを正確に追跡した後。シェルから直接渡されることがわかりました。lesscこれにより、すべての変数を削除し、文字通りコンパイラにファイルを解析させようとすることに気づきました。

物理ファイルシステムパスに関して、ソースファイルからインポートするファイルへの相対パスが必要であることがわかりました。そのため、私は自分に戻ってそこから<project_root>参照assets/css/lib.lessする必要がありました。最終的に機能した実際のインポートは次のとおりです。

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

しかし非常に奇妙なのは、lessc が絶対ファイルシステム パス (つまり ) を受け入れない/path/to/project/assets/css/lib.lessことです。理由はわかりません。

更新 (2012 年 2 月 8 日)

最終的にコードをステージング環境にプッシュして実行したとき、完全な「DUH」の瞬間がありましたcollectstatic私が使用していた @import パスは、それがファイルへの物理パスであったため、開発ではうまく機能しましたが、いったんcollectstaticそれが完了すると、すべてが移動され、<project_root>/static/.

@importの前後のパスを一致させるためにシンボリック リンクを使用するというアイデアをいじくり回しましたcollectstaticが、長期的には複雑すぎて壊れやすいと判断しました。

SO ...すべてのLESSファイルを分解してまとめて<project_root>/assets/css/移動し、機能するためにプロジェクトレベルのファイルに関連付けられているため、本質的にプロジェクトレベルであるため、LESSファイルをアプリから移動することを合理化しました彼ら自身。

于 2012-01-24T17:57:59.903 に答える
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 として使用できます。

less ファイルを更新するたびに、collectstatic を実行してそれらをローカル ディレクトリに集約し、コンプレッサーがless適切なソース ファイルを処理できるようにする必要があります。それ以外の場合、コンプレッサーはすべてをスムーズに処理します。symlinkを使用することもできますcollectstatic -l。つまり、新しいファイルを追加するときにのみファイルを収集する必要があります。

サーバーがリロードされるたびにサブクラスrunserverを呼び出すか、更新時に直接呼び出す管理コマンドを実装することを検討しています。collectstaticdjango.utils.autoreloadcollectstatic

編集 (2014/12/01): 上記で概説した私のアプローチには、ローカルの静的ルートが必要です。実稼働環境でオフライン圧縮を使用してリモート ストレージを使用していたため、展開にはいくつかの追加手順が必要です。collectstatic静的ファイルをリモート ストレージに同期するための呼び出しに加えて、collectstaticローカル ストレージを使用する別の django 構成ファイルを呼び出します。ファイルをローカルに収集したら、'compress' を呼び出して、結果ファイルをリモート ストレージにアップロードするように構成し、ローカル ストレージでソース ファイルを探すことができます。

于 2014-09-19T08:03:44.633 に答える