使用 Windows 中的 shell 脚本递归合并和编译 SCSS 文件
Merge and compile SCSS files recursively using shell script in Windows
情况是这样的。我目前的项目具有以下文件夹结构:
-- public_html
-- assets
-- scss (contains SCSS files, which can be located inside subfolders)
-- scripts
-- vendor
-- plugins (Also contain some SCSS files from the)
-- css
-- also some other folders (no scss or css here though)
-- dist (distribution folder)
-- other folders too for html, php etc...
当我要将脚本上传到我的远程服务器时,我首先将 public_html
中的完整文件夹结构处理到 dist
。我使用构建脚本 build.sh
执行此操作,您可以在此处查看:
function prepareForBuild(){
echo "Updating dependencies...";
bower install
echo "Preparing 'dist' directory...";
mkdir -p dist
rm -rf dist/*
# for the Whosebug markup... */
}
function buildApp(){
cd assets
echo "Creating temp directory..."
mkDir -p temp
## MERGING TAKES (OR SHOULD) PLACE HERE
find "/" -name '*.scss' -exec cat {} \; > merge.scss
cd ../
pause
# requirejs optimization
echo "Optimizing files...";
node r.js -o build/build.js
}
function cleanup(){
echo "Cleaning up unnecessary files...";
cd dist
rm -f bower.json .gitignore .bowerrc README.md .DS_Store config.rb
rm -f build.sh build.txt composer.json composer.lock
rm -rf build dist scss .git .sass-cache .idea
}
function pause(){
read -p "$*"
}
prepareForBuild
buildApp && cleanup
echo "Building finished!";
问题:
但是,当我 运行 Git bash 终端中的脚本在这一行中断:
find "/" -name '*.scss' -exec cat {} \; > merge.scss
编辑:“/”或“\”似乎对问题没有影响:(
此外,运行 来自根 (public_html) 目录:
它 returns 在正常的命令提示符 "File not found - *.scss" 中(并输出一个空的 merge.scss 文件)并在 Git bash 中停止工作终端。
我将这一行基于 this answer, but I can't get it to work for me. I also tried something like this 而不是,但这只会 returns 更多错误。
我在这里错过了什么?
编辑!
我以为 bash shell 只是停止工作,但似乎并非如此。过了一会儿它 returns 这个:
这是什么意思?参考文件夹不对?
Objective:
如前所述,我想递归扫描 assets 文件夹中的 .scss
个文件并将它们合并为一个 default.scss
.
如果这太难问了,另一个与 require.js
(或简单地与节点)集成的解决方案也是可能的,正如您在我的脚本中看到的那样,我已经使用 require.js
进行标准优化.
感谢您的耐心等待!
您的 -exec 选项缺少 {} 特殊元素,这意味着匹配每个 find[=20 的文件=] 迭代。此外,你不能明确地使用'\'作为根路径,至少它会是'/'。
然而,理想情况下,您应该使用特定的子路径以获得更高的效率,并且出于权限访问的原因(我猜您的使用可能没有权限从根路径访问所有子路径?)。
至少,您可以将说明更新为:
find '/' -type f -name "*.scss" -exec cat {} \; > merge.scss
如果要扫描assets目录下的文件,那么在find
命令中不要指定根目录。省略目录也可能是个好主意。
find . -name "*.scss" -not -type d -exec cat {} \; > merge.scss
如果您希望在新创建的 temp
目录中创建 merge.scss
文件,您需要将其设为当前目录。然后您可以从父目录 assets
进行文件扫描。
function buildApp(){
cd assets
echo "Creating temp directory..."
mkDir -p temp
## MERGING TAKES (OR SHOULD) PLACE HERE
cd temp
find .. -name '*.scss' -not -type d -exec cat {} \; > merge.scss
cd ../
pause
# requirejs optimization
echo "Optimizing files...";
node r.js -o build/build.js
}
此外,pause
命令在 bash shell 中对您有用吗?这是一个 Windows 命令,除非你有别的东西。
情况是这样的。我目前的项目具有以下文件夹结构:
-- public_html
-- assets
-- scss (contains SCSS files, which can be located inside subfolders)
-- scripts
-- vendor
-- plugins (Also contain some SCSS files from the)
-- css
-- also some other folders (no scss or css here though)
-- dist (distribution folder)
-- other folders too for html, php etc...
当我要将脚本上传到我的远程服务器时,我首先将 public_html
中的完整文件夹结构处理到 dist
。我使用构建脚本 build.sh
执行此操作,您可以在此处查看:
function prepareForBuild(){
echo "Updating dependencies...";
bower install
echo "Preparing 'dist' directory...";
mkdir -p dist
rm -rf dist/*
# for the Whosebug markup... */
}
function buildApp(){
cd assets
echo "Creating temp directory..."
mkDir -p temp
## MERGING TAKES (OR SHOULD) PLACE HERE
find "/" -name '*.scss' -exec cat {} \; > merge.scss
cd ../
pause
# requirejs optimization
echo "Optimizing files...";
node r.js -o build/build.js
}
function cleanup(){
echo "Cleaning up unnecessary files...";
cd dist
rm -f bower.json .gitignore .bowerrc README.md .DS_Store config.rb
rm -f build.sh build.txt composer.json composer.lock
rm -rf build dist scss .git .sass-cache .idea
}
function pause(){
read -p "$*"
}
prepareForBuild
buildApp && cleanup
echo "Building finished!";
问题:
但是,当我 运行 Git bash 终端中的脚本在这一行中断:
find "/" -name '*.scss' -exec cat {} \; > merge.scss
编辑:“/”或“\”似乎对问题没有影响:(
此外,运行 来自根 (public_html) 目录:
它 returns 在正常的命令提示符 "File not found - *.scss" 中(并输出一个空的 merge.scss 文件)并在 Git bash 中停止工作终端。 我将这一行基于 this answer, but I can't get it to work for me. I also tried something like this 而不是,但这只会 returns 更多错误。 我在这里错过了什么?
编辑!
我以为 bash shell 只是停止工作,但似乎并非如此。过了一会儿它 returns 这个:
Objective:
如前所述,我想递归扫描 assets 文件夹中的 .scss
个文件并将它们合并为一个 default.scss
.
如果这太难问了,另一个与 require.js
(或简单地与节点)集成的解决方案也是可能的,正如您在我的脚本中看到的那样,我已经使用 require.js
进行标准优化.
感谢您的耐心等待!
您的 -exec 选项缺少 {} 特殊元素,这意味着匹配每个 find[=20 的文件=] 迭代。此外,你不能明确地使用'\'作为根路径,至少它会是'/'。
然而,理想情况下,您应该使用特定的子路径以获得更高的效率,并且出于权限访问的原因(我猜您的使用可能没有权限从根路径访问所有子路径?)。
至少,您可以将说明更新为:
find '/' -type f -name "*.scss" -exec cat {} \; > merge.scss
如果要扫描assets目录下的文件,那么在find
命令中不要指定根目录。省略目录也可能是个好主意。
find . -name "*.scss" -not -type d -exec cat {} \; > merge.scss
如果您希望在新创建的 temp
目录中创建 merge.scss
文件,您需要将其设为当前目录。然后您可以从父目录 assets
进行文件扫描。
function buildApp(){
cd assets
echo "Creating temp directory..."
mkDir -p temp
## MERGING TAKES (OR SHOULD) PLACE HERE
cd temp
find .. -name '*.scss' -not -type d -exec cat {} \; > merge.scss
cd ../
pause
# requirejs optimization
echo "Optimizing files...";
node r.js -o build/build.js
}
此外,pause
命令在 bash shell 中对您有用吗?这是一个 Windows 命令,除非你有别的东西。