【问题标题】:converting whole project to CoffeeScript with js2coffee使用 js2coffee 将整个项目转换为 CoffeeScript
【发布时间】:2015-08-12 15:12:45
【问题描述】:

问题

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

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

查看下面的脚本

【问题讨论】:

  • 我希望你有一个非常完整的测试套件,js2coffee 可以对你的代码做一些奇怪的事情。你最好手动翻译你的代码,甚至更好,不要管它,当你更新功能时,把它一点一点地翻译成 CoffeeScript。
  • 更多的是关于使用 bash 和 stdin/out 重定向来让生活更轻松 - 除了潜伏的 cs2:github.com/michaelficarra/CoffeeScriptRedux

标签: javascript coffeescript


【解决方案1】:

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

一个简单的 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` .... 表示:

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

查找参数:

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

-type f 必须是 file 类型,因为我们不需要 .js 目录,而只需要文件

-o -path './node_modules' -prune

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

阻止:

if [ -e ${FILE} ] ; then

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

字符串操作:

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

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

转化:

js2coffee "$FILE" > "$COFFEE" 我们将 FILECOFFEE 作为 strings

提供给 js2coffee

额外:

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

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

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

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

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

更新

您可以在第一次运行后将dittorsyncmv 交换以移动文件,因为mv 就像cp 一样不会创建子目录。

更新 2

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

更新 3

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

【讨论】:

    【解决方案2】:

    对于那些时间短的人 - 使用这个漂亮的单线! 它开始在当前目录中 ./ 并通过子目录 将每个.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-04-21
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 2014-06-24
      • 2016-05-21
      • 2012-04-28
      • 1970-01-01
      相关资源
      最近更新 更多