我有一个包含许多Less CSS文件的目录。最好的方法是什么,将它们编译成常规的CSS(用于部署)?
我想要运行以下命令:
lessc -r less/ css/
lessc是一个less编译器(通过node包管理器安装)。
@import "variables.less";
@import "mixins.less";
$ find less_directory/ -name '*.less' -exec lessc {} \; > combined.css
或者生产环境下进行压缩:
$ find less_directory/ -name '*.less' -exec lessc -x {} \; > combined.css
如果您想将多个less文件编译成多个css文件,请尝试这个一行的bash脚本:
如果你想将多个 less 文件 编译成 多个 css 文件,可以尝试这个一行的 bash 脚本:
for file in *.less; do lessc -x --yui-compress -O2 --strict-imports $file `basename $file`.css ; done
运行该命令后,您将获得.less.css文件列表。
注:它还会使用最大优化选项(-O2),压缩(-x)和使用YUI Compressor(--yui-compress)进行缩小,并采用严格的导入评估(--strict-imports)。
已编辑:对于新的YUI Compressor版本,跳过-02和--yui-compress已过时,因此:
for file in *.less; do lessc -x --strict-imports $file `basename $file`.css ; done
-O2
和--yui-compress
都已经被弃用,所以你应该跳过它们。 - Zackbasename
无法去除 .less
的人吗?我用 basename $file
替换成了 basename $file | cut -f 1 -d '.'
。 - MuffinTheManbasename $file .less
替换 basename $file
。我想编辑答案,但我对此不太自信。有人能确认这不仅仅是我吗?如果不是,可以编辑答案吗? - MuffinTheManfind "$PWD" -name '*.less' | while read line; do
REPLACE=`echo $line | sed "s|\.less|\.css|"`
# echo "$line --> $REPLACE"
(lessc "$line" "$REPLACE" &)
done
#/bin/bash
echo "Compiling all LESS files to CSS"
for file in *.less
do
FROM=$file
TO=${file/.*/.css}
echo "$FROM --> $TO"
lessc $FROM $TO
done
#!/bin/bash
# file name: lesscdir
if [[ -z $1 || -z $2 ]];then
echo 'both arguments are needed'
exit
fi
find $1 -name '*.less' -printf '%P\n' | while read name; do
FROM=$(echo $1'/'$name)
TO=$(echo $2'/'$name | sed "s|\.less|\.css|")
TO_DIRNAME=$(dirname $TO)
if [ ! -e $TO_DIRNAME ];then
mkdir -p $TO_DIRNAME
fi
echo 'Compiling' $FROM '->' $TO
lessc $FROM $TO
done
然后:
$ chmod +x lesscdir
$ sudo ln -s $(readlink -f lesscdir) /usr/local/bin/
虽然我最喜欢使用Python并且用它解决大部分问题,但在Linux环境中使用Bash也非常愉快。
我写了一个粗糙的脚本来解决这个问题:
#!/usr/bin/env python
#This is responsible for "compiling" less.css files to regular css files for production. It also minifies the css at the same time.
#Usage: give it a start directory as the first parameter and an end directory as the second parameter. It will recursivly run the appropriate command for all css files in the first subdirectory.
import os
import sys
import re
if len(sys.argv) < 3:
sys.exit('ERROR: Too many paths!! No less css compiled')
if len(sys.argv) > 3:
sys.exit('ERROR: Not enough paths!! No less css compiled')
start_dir=os.path.join(os.getcwd(),sys.argv[1])
end_dir=os.path.join(os.getcwd(),sys.argv[2])
pattern=r'\.css$'
pattern=re.compile(pattern)
files_compiled=0
def copy_files(start, end, add=''):
global files_compiled
try:
os.mkdir(end)
except:
pass
for folder in get_immediate_subdirectories(start):
copy_files(os.path.join(start,folder), os.path.join(end+folder), add+folder+'/')
for less in os.listdir(start):
if pattern.search(less):
os.system('lessc -x %s > %s'%(start+less,end+less))
print add+less
files_compiled=files_compiled+1
def get_immediate_subdirectories(dir):
return [name for name in os.listdir(dir)
if os.path.isdir(os.path.join(dir, name))]
理想情况下,应该有更好的解决方案。
for file in *.less; do lessc -x --strict-imports $file `basename $file | sed -e "s/less/css/"` ; done
我发现了一个很棒的npm模块lessc-each,可以帮助你实现这个功能!:)
安装它:
$ npm install [-g] lessc-each
运行它:
$ lessc-each ‹dir1› ‹dir2›
其中‹dir1›是要编译的Less文件所在的目录,‹dir2›是输出文件的目录。如果‹dir2›不存在,它将自动创建。两个目录都必须相对于命令行当前路径。
最近我在运行类似以下的东西时遇到了问题:
lessc directory/*.less foo.css
与其将不同的 LESS 文件合并输出到 foo.css,它会修改列表中的第二个文件。我不认同这种做法。
为了解决这个问题,我创建了一个名为 lessm
的新 LESS 前端。
你可以在 https://github.com/jive/lessm 查看它。
使用方式如下:
lessm foo.less foo2.less ../bar/bazz.less -o output.css
@echo cd ".\pages" for /r %%i in (*.less) do call lessc --clean-css "%%~i" "%%~dpni.min.css" cd ..
文件夹“pages”中及其子文件夹中的所有less文件都将被编译。 - DAme