7

问题

js2coffe仅适用于单个文件输入/输出重定向。转换整个项目及其目录结构可能会很痛苦。

想要转换ExpressJS默认应用程序项目,包括。它的目录结构?

看看下面的脚本

4

2 回答 2

23

更新:如果您赶时间,请查看下面这个脚本的简短版本。

一个简单的 Bash 脚本为你完成了这项工作:

#!/bin/bash

for FILE in `find . -name "*.js" -type f -o -path './node_modules' -prune -o -path './components' -prune`
do 
    if [ -e $FILE ] ; then        
        COFFEE=${FILE//.js/.coffee}

        echo "converting ${FILE} to ${COFFEE}"
        js2coffee "$FILE" > "$COFFEE"
    else     
        echo "File: {$1} does not exist!"
    fi
done

制作一个文件,例如 all2coffee,将其放在 /usr/local/bin 中,chmod + x在终端中添加一个标志

要求

js2coffee全局安装,如果尚未安装,请执行以下操作:npm install -g js2coffee

脚本解释

for循环:

for FILE in `find arguments` ....方法:

FILE每次find偶然发现 .js 文件时,都会将查找输出分配给字符串

查找参数:

-name "*.js" 获取所有以 .js 结尾的文件

-type f必须是文件类型,因为我们不想要 .js 目录,但只有文件

-o -path './node_modules' -prune

排除目录中的文件./node_modules添加-prune是至关重要的,否则 find 将进入目录并打印*.js在目录中找到的文件

做块:

if [ -e ${FILE} ] ; then

-e标志检查来自的字符串FILE是否是文件系统上的现有文件,否则else执行。

字符串操作:

COFFEE=${FILE//.js/.coffee}

我们COFFEE将变量分配给一个字符串,我们 通过 bash 字符串操作将.js替换为.coffee :${STRING//match_this/replace_with}

转换:

js2coffee "$FILE" > "$COFFEE"我们将 js2coffee 用FILECOFFEE作为字符串提供

额外的:

您想将所有转换后的 .coffee 文件移动到新目录,但保留结构?

在 Linux 或Os X 上使用find with ,因为 cp 不会创建此命令所需的目录。这里有一个在主目录中执行的小脚本,它将完成这项工作rsyncditto

所有 .coffee 文件都将在 /coffee 目录中复制 .js 文件层次结构

for FILE in `find . -name "*.coffee"`
do 
    ditto .${FILE/./} coffee${FILE/./}    
done

将文件转换为 .coffee执行此操作

更新

您可以在第一次运行后交换dittorsync使用mv以移动文件,因为mvlikecp不会创建子目录。

更新 2

为那些准时添加了一个班轮,请参阅下面的第二个答案!

更新 3

./node_modules为那些不想转换其依赖项的人添加了一个从转换中排除目录的选项

于 2012-12-30T15:10:31.187 回答
9

对于那些时间短的人 - 使用这个漂亮的单线! 它从当前目录 ./ 开始,并通过子目录将每个.js文件打磨到.coffee

find . -type f -name '*.js' | while read f; do echo "grinding $f to ${f/.js/.coffee} "; js2coffee "$f" > "${f/.js/.coffee}"; done

想从转换中排除 ./node_modules目录?改用下面的一个:

find . -path ./node_modules -prune -o -type f -name '*.js' | while read f; do echo "grinding $f to ${f/.js/.coffee} "; js2coffee "$f" > "${f/.js/.coffee}"; done

小提示: 您也可以使用此循环来移动或复制文件:将js2coffee命令替换为您需要执行的任何操作。 find输出(找到的文件列表)可以简单地修改和过滤。

在 bash 中,子字符串提取(或替换)很简单——如上例所示:

重要(长版) bash 变量可以通过在变量名称前添加$来访问- 但最初它们是在没有$的情况下定义的,因此为了您的心理健康请记住这一点并检查您的代码中的 $var/var= 语法以防万一你出现了一些不太合乎逻辑的错误。在一段时间没有在 Bash 中做任何事情之后,我一遍又一遍地犯了这个错误,所以我认为分享这个简单的事实是明智的(也可能是我,作为一个糟糕的开发人员)

重要(短版)变量定义:var_name=value变量访问:$var_name=value,坏主意:$var_name=value,稍后由$var_name.

在示例中,变量f$f访问,使用${f}访问我们将.js -> /.js(/ 是分隔符)替换为.coffee ->/.coffee如下所示${f/.js/.coffee}

apple="green"; 
echo $apple;

输出:

green

于 2014-01-30T23:31:58.123 回答