问题:
js2coffe仅适用于单个文件输入/输出重定向。转换整个项目及其目录结构可能会很痛苦。
想要转换ExpressJS默认应用程序项目,包括。它的目录结构?
看看下面的脚本
问题:
js2coffe仅适用于单个文件输入/输出重定向。转换整个项目及其目录结构可能会很痛苦。
想要转换ExpressJS默认应用程序项目,包括。它的目录结构?
看看下面的脚本
更新:如果您赶时间,请查看下面这个脚本的简短版本。
一个简单的 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 用FILE和COFFEE作为字符串提供
额外的:
您想将所有转换后的 .coffee 文件移动到新目录,但保留结构?
在 Linux 或Os X 上使用find with ,因为 cp 不会创建此命令所需的目录。这里有一个在主目录中执行的小脚本,它将完成这项工作rsyncditto
所有 .coffee 文件都将在 /coffee 目录中复制 .js 文件层次结构
for FILE in `find . -name "*.coffee"`
do
ditto .${FILE/./} coffee${FILE/./}
done
将文件转换为 .coffee后执行此操作
更新
您可以在第一次运行后交换ditto或rsync使用mv以移动文件,因为mvlikecp不会创建子目录。
更新 2
为那些准时添加了一个班轮,请参阅下面的第二个答案!
更新 3
./node_modules为那些不想转换其依赖项的人添加了一个从转换中排除目录的选项
对于那些时间短的人 - 使用这个漂亮的单线!
它从当前目录 ./ 开始,并通过子目录将每个.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