2012-01-24 25 views
9

Đây là kịch bản:Đường dẫn LESS @import của tôi nên là gì?

Tôi đang chạy Django 1.3.1, sử dụng các tệp tĩnh và máy nén django (mới nhất), trong số những thứ khác, biên dịch tệp LESS.

Tôi có thư mục "nội dung" được nối vào các tệp tĩnh với STATICFILES_DIRS (đối với tài nguyên tĩnh toàn dự án). Trong thư mục đó tôi có một thư mục "css" và trong đó một tập tin "lib.less" có chứa các biến LESS và mixin.

Vì vậy, đường dẫn vật lý là <project_root>/assets/css/lib.less và được phục vụ tại /static/css/lib.less.

Trong một trong các thư mục tĩnh của ứng dụng của tôi, tôi có một tệp LESS khác cần nhập tệp ở trên. Đường dẫn vật lý cho điều đó là <project_root>/myapp/static/myapp/css/file.less và đường dẫn sẽ được phục vụ tại /static/myapp/css/file.less.

Suy nghĩ đầu tiên của tôi là:

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

(ví dụ: dựa trên URL, đi lên đến cấp độ từ /static/myapp/css để /static/, sau đó đi qua xuống /static/css/lib.less).

Tuy nhiên, điều đó không hiệu quả và tôi đã thử mọi kết hợp URL và đường dẫn vật lý mà tôi có thể nghĩ và tất cả chúng đều cho tôi FilterError s trong mẫu, do không thể tìm thấy tệp để nhập.

Bất kỳ ai có ý tưởng nào về đường dẫn nhập thực tế phải là gì?

Trả lời

11

Sau khi theo dõi chính xác nơi lỗi xảy ra trong nguồn máy nén django. Hóa ra nó được truyền trực tiếp từ vỏ. Điều này đã giúp tôi loại bỏ tất cả các biến và nghĩa đen chỉ đang cố gắng để có được trình biên dịch lessc để phân tích cú pháp tệp.

Hóa ra nó muốn có đường dẫn tương đối từ tệp nguồn đến tệp được nhập theo đường dẫn hệ thống tệp vật lý. Vì vậy, tôi đã phải quay trở lại tất cả các cách để <project_root> của tôi và sau đó tham khảo assets/css/lib.less từ đó. Việc nhập khẩu thực tế mà cuối cùng làm việc là:

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

gì rất kỳ quặc dù là lessc rằng sẽ không chấp nhận một hệ thống tập tin đường dẫn tuyệt đối (ví dụ: /path/to/project/assets/css/lib.less). Tôi cung không chăc tại sao.

CẬP NHẬT (02/08/2012)

Đã có một hoàn thành "DUH" khoảnh khắc khi tôi cuối cùng đã đẩy mã của tôi để môi trường dàn dựng của tôi và chạy collectstatic. Đường dẫn @import tôi đã sử dụng làm việc tốt trong phát triển vì đó là đường dẫn vật lý đến tệp rồi, nhưng khi collectstatic đã thực hiện, mọi thứ được di chuyển xung quanh và liên quan đến <project_root>/static/.

Tôi đã đùa giỡn với ý tưởng sử dụng các liên kết tượng trưng để cố gắng kết hợp các đường dẫn trước và sau collectstatic @import, nhưng tôi đã quyết định rằng quá phức tạp và mong manh về lâu dài.

SO ...Tôi đã chia nhỏ và di chuyển tất cả các tệp LESS lại với nhau theo <project_root>/assets/css/ và hợp lý hóa việc di chuyển tệp LESS ra khỏi ứng dụng vì chúng được gắn với tệp cấp dự án để hoạt động, chúng vốn là bản thân cấp dự án.

+0

Blah! Tôi nghĩ rằng tôi sẽ phải làm như vậy ... Trình biên dịch dev cục bộ của tôi không nhận thức được các tệp tĩnh của django .. vì vậy ngay cả khi tôi đã sửa đổi quy trình làm việc của mình để thu thập cục bộ, trình biên dịch của tôi sẽ sửa đổi các tệp trong/static/dir. Một chút không may. Bạn đã kết thúc bằng cách sử dụng staticfiles cho tất cả mọi thứ nhưng CSS? –

+0

Tôi đã kết thúc việc chuyển ít tệp của mình sang 'nội dung/ít hơn/sản phẩm.không có' và xóa cấu trúc thư mục ứng dụng. Một ứng dụng với tất cả các tài sản của nó cảm thấy rất sạch sẽ, nó quá xấu nó đã biến mất! –

+1

Có lẽ tôi đang thiếu một cái gì đó, nhưng tại sao không chỉ cấu hình 'lessc' với một vài con đường bao gồm mà làm cho nó, do đó bạn không phải sử dụng những đường dẫn tương đối? Nó có thể không lý tưởng hoặc không gian tên-y, nhưng không phải là giải pháp của bạn. – tmandry

4

Tôi sắp xếp trong cùng một liên kết và đây là những gì tôi đã đưa ra cho các phiên bản mới nhất của máy nén và lessc để tích hợp với các tệp tĩnh. Hy vọng rằng điều này sẽ giúp một số người khác ra ngoài

Theo như tôi có thể nói từ thử nghiệm, lessc không có khái niệm về đường dẫn tuyệt đối hoặc tương đối. Thay vào đó, có vẻ như để duy trì một đường dẫn tìm kiếm, trong đó bao gồm các thư mục hiện hành, thư mục chứa các tập tin ít hơn, và bất cứ điều gì để bạn vượt qua nó thông qua --include-path

như vậy trong cấu hình của mình cho máy nén tôi đặt

COMPRESS_PRECOMPILERS = (
    ('text/less', 'lessc --include-path=%s {infile} {outfile}' % STATIC_ROOT), 
) 

Say, sau khi chạy collectstatic tôi có sống bootstrap tại

STATIC_ROOT/bootstrap/3.2.0/bootstrap.css. 

sau đó từ bất kỳ tập tin ít, bây giờ tôi có thể viết

@import (less, reference) "/bootstrap/3.2.0/bootstrap.css" 

cho phép tôi sử dụng các lớp bootstrap dưới dạng ít mixin trong bất kỳ tệp nào ít hơn của tôi!

Mỗi khi tôi cập nhật tệp ít hơn, tôi phải chạy tập hợp để tổng hợp chúng trong một thư mục cục bộ để máy nén có thể cung cấp cho các tệp nguồn phù hợp để làm việc trên less. Nếu không, máy nén sẽ xử lý mọi thứ suôn sẻ. Bạn cũng có thể sử dụng collectstatic -l để liên kết tượng trưng, ​​điều đó có nghĩa là bạn chỉ cần thu thập tệp khi bạn thêm tệp mới.

tôi đang xem xét thực hiện một lệnh quản lý để mịn ra quá trình phát triển mà một trong hai lớp con runserver gọi collectstatic mỗi lần máy chủ được nạp lại, hoặc sử dụng django.utils.autoreload trực tiếp để gọi collectstatic khi mọi thứ được cập nhật.

Chỉnh sửa (2014/12/01): Cách tiếp cận của tôi như được nêu ở trên yêu cầu gốc tĩnh cục bộ. Tôi đã sử dụng bộ nhớ từ xa với tính năng nén ngoại tuyến trong môi trường sản xuất của mình, do đó việc triển khai yêu cầu thêm một vài bước. Ngoài việc gọi collectstatic để đồng bộ hóa các tệp tĩnh với bộ nhớ từ xa, tôi gọi collectstatic với tệp cấu hình django khác sử dụng bộ nhớ cục bộ. Sau khi tôi đã thu thập các tệp cục bộ, tôi có thể gọi 'nén', đã định cấu hình để tải tệp kết quả lên bộ nhớ từ xa, nhưng hãy xem bộ nhớ cục bộ cho tệp nguồn.

Các vấn đề liên quan