关于终端:将多个Coffeescript文件合并到一个文件中?

Join multiple Coffeescript files into one file? (Multiple subdirectories)

我有一堆咖啡文件需要加入到一个文件中。

我的文件夹设置类似于Rails应用程序:

1
2
3
/src/controller/log_controller.coffee
/src/model/log.coffee
/src/views/logs/new.coffee

coffeescript有一个命令,允许您将多个coffeescript加入到一个文件中,但它似乎只适用于一个目录。例如,这很好:

1
coffee --output app/controllers.js --join --compile src/controllers/*.coffee

但我需要能够包括一堆子目录,类似于这个非工作命令:

1
coffee --output app/all.js --join --compile src/*/*.coffee

有办法吗?是否有一种单一的方法来传递子目录中所有文件的列表?

我在使用OSX中的终端。

它们都必须合并到一个文件中,否则每个单独的文件都将被编译并包装为:

1
(function() { }).call(this);

它打破了一些函数调用的范围。


从CoffeeScript文档中:

-j, --join [FILE] : Before compiling, concatenate all scripts together in the order they were passed, and write them into the specified file. Useful for building large projects.

所以,您可以在命令行(我使用bash)实现您的目标,如下所示:

1
coffee -cj path/to/compiled/file.js file1 file2 file3 file4

其中file1-filen是要编译的coffeescript文件的路径。


您可以编写一个shell脚本或rake任务,首先将它们组合在一起,然后编译。类似:

find . -type f -name '*.coffee' -print0 | xargs -0 cat > output.coffee

然后编译output.coffee

根据需要调整路径。还要确保output.coffee文件与使用find搜索的路径不同,否则将进入无限循环。

http://man.cx/查找|网址:http://www.rubyrake.org/tutorial/index.html

此外,您可能对StackOverflow上关于跨目录搜索的其他文章感兴趣:

  • 如何计算包含子目录的代码行数
  • bash脚本在目录树中查找文件并将其附加到另一个文件
  • 用于查找目录中所有文件夹的Unix脚本


我刚刚发布了一个alpha版的咖啡机,我想它可能会对你有所帮助。http://github.com/serpentem/coffee-toaster


这有助于我(-o输出目录,-j加入project.js,-cw全面编译和观看coffeescript目录):

1
coffee -o web/js -j project.js -cw coffeescript

使用Coffee命令行工具最简单的方法。

咖啡——输出公共——加入——编译应用程序

app是我的工作目录,包含多个子目录,public是~output.js文件的存放位置。如果在nodejs中编写应用程序,很容易实现此过程的自动化


使用cake将它们全部编译到一个(或多个)生成的.js文件中。cakefile用作控制咖啡脚本编译顺序的配置——对于更大的项目来说非常方便。

cake非常容易安装和设置,在编辑项目时从vim调用cake很简单

1
:!cake build

您可以刷新浏览器并查看结果。

由于我也在忙着学习文件结构的最佳方法,并将咖啡脚本与主干和蛋糕结合使用,所以我在Github上创建了一个小项目,以供自己参考,也许它也能帮助您解决蛋糕和一些基本的事情。所有编译的文件都在www文件夹中,这样您就可以在浏览器中打开它们,所有源文件(cake配置除外)都在src文件夹中。在本例中,所有的.coffee文件都被编译并组合在一个output.js文件中,该文件随后包含在HTML中。


或者,您可以使用--bare标志,编译为javascript,然后根据需要包装JS。但这可能会造成问题;例如,如果您有一个包含代码的文件

1
2
3
4
i = 0
foo = -> i++
...
foo()

然后在生成的javascript中只有一个var i声明,i将递增。但是如果您将foo函数声明移动到另一个coffeeesccript文件中,那么它的i将位于foo范围内,而外部i将不受影响。

因此,连接coffeescript是一个更明智的解决方案,但是这里仍然存在混淆的可能性;您连接代码的顺序几乎肯定会很重要。我强烈建议您改为模块化代码。