Каким должен быть мой путь LESS @import?

Вот сценарий:

Я использую Django 1.3.1, используя статические файлы и django-compressor (последняя стабильная версия), чтобы, среди прочего, компилировать файлы LESS.

У меня есть каталог «активы», который подключен к статическим файлам с помощью STATICFILES_DIRS (для статических ресурсов всего проекта). В этом каталоге у меня есть каталог «css», а в этом файле «lib.less», который содержит переменные 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-адресов и физических путей, которые только мог придумать, и все они дают мне FilterErrors в шаблоне из-за невозможности найти файл для импорта.

У кого-нибудь есть идеи, каким должен быть фактический путь импорта?


person Chris Pratt    schedule 24.01.2012    source источник


Ответы (2)


После точного определения источника ошибки в исходном коде django-compressor. Оказывается, он напрямую передается из оболочки. Это подсказало мне удалить все переменные и буквально просто попытаться заставить компилятор lessc проанализировать файл.

Оказывается, он хочет, чтобы относительный путь от исходного файла к файлу был импортирован с точки зрения пути физической файловой системы. Поэтому мне пришлось полностью вернуться к моему <project_root>, а затем сослаться на assets/css/lib.less оттуда. Фактический импорт, который, наконец, сработал, был:

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

Что очень странно, так это то, что lessc не принимает абсолютный путь к файловой системе (например, /path/to/project/assets/css/lib.less). Я не уверен, почему.

ОБНОВЛЕНИЕ (08.02.2012)

Был полный «DUH», когда я, наконец, отправил свой код в свою промежуточную среду и запустил collectstatic. Путь @import, который я использовал, отлично работал при разработке, потому что это был физический путь к файлу then, но как только collectstatic сделал свое дело, все перемещается относительно <project_root>/static/.

Я обдумывал идею использования символических ссылок, чтобы попытаться сопоставить пути до и после collectstatic @import, но решил, что это слишком сложно и хрупко в долгосрочной перспективе.

ТАК... Я сломал и переместил все файлы LESS вместе под <project_root>/assets/css/ и рационализировал перемещение файлов LESS из приложений, потому что, поскольку они привязаны к файлу уровня проекта для функционирования, они по своей сути являются проектами. выровнять себя.

person Chris Pratt    schedule 24.01.2012
comment
Бла! Я думаю, мне придется сделать то же самое... Мой локальный компилятор dev не знает о статических файлах django.. поэтому, даже если я изменил свой рабочий процесс для локального запуска collectstatic, мой компилятор изменит файлы в каталоге /static/. , Немного неудачно. Вы все еще использовали статические файлы для всего, кроме CSS? - person Yuji 'Tomita' Tomita; 28.06.2012
comment
В итоге я переместил меньше файлов в assets/less/products.less и удалил структуру папок приложения. Одно приложение со всеми его активами кажется таким чистым, что очень жаль, что его больше нет! - person Yuji 'Tomita' Tomita; 28.06.2012
comment
Может быть, я что-то упускаю, но почему бы просто не настроить lessc с несколькими путями включения, чтобы вам не приходилось использовать эти относительные пути? Это может быть не идеальное или пространство имен, но и ваше решение тоже. - person tmandry; 15.03.2013

Я как бы в том же положении, и это то, что я придумал для самых последних версий компрессора и 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"

что позволяет мне использовать классы начальной загрузки в качестве меньшего количества миксинов в любом из моих файлов меньшего размера!

Каждый раз, когда я обновляю файл меньшего размера, мне приходится запускать collectstatic для их объединения в локальный каталог, чтобы компрессор мог предоставить less нужные исходные файлы для работы. В противном случае компрессор справляется со всем гладко. Вы также можете использовать collectstatic -l для символической ссылки, что означает, что вам нужно собирать файлы только при добавлении нового.

Я рассматриваю возможность реализации команды управления, чтобы сгладить процесс разработки, который либо подклассы runserver вызывают collectstatic каждый раз, когда сервер перезагружается, либо использует django.utils.autoreload напрямую для вызова collectstatic при обновлении вещей.

Редактировать (2014/12/01): мой подход, описанный выше, требует локального статического корня. Я использовал удаленное хранилище с автономным сжатием в своей производственной среде, поэтому для развертывания требуется пара дополнительных шагов. В дополнение к вызову collectstatic для синхронизации статических файлов с удаленным хранилищем я вызываю collectstatic с другим файлом конфигурации django, который использует локальное хранилище. После того, как я собрал файлы локально, я могу вызвать «сжатие», настроив его для загрузки файлов результатов в удаленное хранилище, но искать исходные файлы в локальном хранилище.

person wjin    schedule 19.09.2014