问题:
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 不会创建此命令所需的目录。这里有一个在主目录中执行的小脚本,它将完成这项工作rsync
ditto
所有 .coffee 文件都将在 /coffee 目录中复制 .js 文件层次结构
for FILE in `find . -name "*.coffee"`
do
ditto .${FILE/./} coffee${FILE/./}
done
将文件转换为 .coffee后执行此操作
更新
您可以在第一次运行后交换ditto
或rsync
使用mv
以移动文件,因为mv
likecp
不会创建子目录。
更新 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