使用js2coffee将整个项目转换为CoffeeScript

时间:2012-12-30 15:10:31

标签: javascript coffeescript

问题

js2coffe 仅适用于单个文件输入/输出重定向。 转换整个项目,它的目录结构可能是一个真正的痛苦。

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

查看下面的脚本

2 个答案:

答案 0 :(得分:23)

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

一个简单的Bash脚本执行Job for ya:

#!/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

SCRIPT EXPLAINED

for循环:

for FILE in `find arguments` ....表示:

每当FILE偶然发现.js文件时,

将查找输出分配给find字符串

查找参数:

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

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

-o -path './node_modules' -prune

排除目录 ./node_modules 中的文件,添加 -prune 至关重要,否则将会进入目录并打印 {{1在目录

中找到的文件

阻止

*.js

-e 标记检查 if [ -e ${FILE} ] ; then 中的字符串是否是文件系统上的现有文件,否则执行FILE

字符串操作:

else

我们将COFFEE=${FILE//.js/.coffee}变量作为我们替换的字符串 .js .coffee 通过bash字符串操作:COFFEE

<强>转换:

${STRING//match_this/replace_with}我们将带有js2coffee "$FILE" > "$COFFEE"FILE的js2coffee作为字符串

<强> EXTRA:

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

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

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

ditto

执行此之后将文件转换为.coffee

<强>更新

您可以在第一次运行后与for FILE in `find . -name "*.coffee"` do ditto .${FILE/./} coffee${FILE/./} done 交换dittorsync以移动文件,因为mv mv不会创建子目录。< / p>

更新2

按时为这些人添加一个衬垫,请参阅下面的第二个答案!

更新3

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

答案 1 :(得分: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 < / strong> - &gt; .coffee - &gt; /.js(/是分隔符) /.coffee是这样的:${f/.js/.coffee}

apple="green"; 
echo $apple;

输出:

green