在Windows中使用Shell脚本递归合并和编译SCSS文件

时间:2018-10-21 16:13:14

标签: node.js bash cmd sass requirejs

这就是这种情况。我目前的项目具有以下文件夹结构:

-- 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 stackoverflow 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)目录运行:test run

在正常命令提示符下返回“找不到文件-* .scss”(并输出一个空的merge.scss文件),并只是在Git bash终端中停止工作。 我根据this的答案写了这一行,但是我无法让它对我有用。我还尝试了类似this的方法,但这只会返回更多错误。 我在这里想念什么?

编辑!

我认为bash shell只是停止工作了,但事实并非如此。一段时间后,它将返回以下内容: Git Bash error 这是什么意思?参考文件夹不正确?

目标:

如前所述,我想递归地扫描资产文件夹中的.scss个文件并将它们合并为一个default.scss

如果这个问题太多了,那么也可以提出与require.js(或仅与节点集成)集成的另一种解决方案,正如您在我的脚本中看到的那样,我已经使用require.js进行标准优化。 / p>

感谢您的时间和耐心!

2 个答案:

答案 0 :(得分:2)

如果要扫描资产目录下的文件,请不要在find命令中指定根目录。省略目录也是一个好主意。

find . -name "*.scss" -not -type d -exec cat {} \; > merge.scss

如果您希望在新创建的merge.scss目录中创建temp文件,则需要将其设置为当前目录。然后,您可以从父目录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
}

另外,在bash shell中,pause命令对您有用吗?除非您另有其他说明,否则这是Windows命令。

答案 1 :(得分:1)

您的 -exec 选项缺少 {} 特殊元素,这意味着与每个 find 迭代匹配的文件。另外,您不能确定地使用'\'作为根路径,至少它是'/'。

不过,理想情况下,出于更好的效率和访问权限的考虑,您应该使用特定的子路径(我想您可能没有权限从根路径访问所有子路径吗?)。

至少,您可以将说明更新为:

find '/' -type f -name "*.scss" -exec cat {} \; > merge.scss