我已经在一个将近完成的JavaScript项目上工作了14个月。这个项目最初只是我期望在一夜之间就能完成的hack,但随着时间的推移,JavaScript部分已经发展成为68个独立文件和10,314行非空代码,目前不幸依赖于C预处理器进行构建。
很难解释我是如何使用cpp来处理JavaScript的:这只是一个hack,我需要一些能够方便地进行宏展开,ifdef、define和include操作的东西。经过大约3秒钟的考虑,我意识到cpp完全"完美"地解决了这个问题:
- 提供一个LOG()宏,在发布模式下消失。
- 提供一个ASSERT()宏,在发布模式下消失,并生成带有原始文件和行号标记的异常。
- 为允许生成"checked"版本的代码交换LOG()和ASSERT()实现,该版本会在紧凑的形式中记录事件,并在发生崩溃时将它们报告回服务器。
- 根据与Python后端共享的配置文件,用"1"替换PROJECT_SOME_CONFIG_VAR_NAME。
像所有真正的hack一样,这个hack现在已经被硬编码到项目中,以至于我真的不愿意想象要替换它所需要的工作量。我的项目正在到达我想将代码库移动到它自己的专用测试服务器(而不是我的笔记本电脑)的阶段,但是在设置Linux实例时,我发现GNU cpp 4.1版本后不再预处理JavaScript并且会崩溃出错。
与其将特定版本的GCC添加到构建要求列表中,我认为现在是真正解决这个问题的好时机。但是,我的问题是我找不到一个具有与cpp相同强大功能和特性的替代预处理器!我考虑过m4,但m4本身也很麻烦。我发现其他一些针对JavaScript的预处理器缺少我目前依赖的所有功能,例如:
__FILE__
&__LINE__
- 可变宏
- 包含保护
- 标记连接
我正在认真考虑为Javascript实现全新的预处理器,完全借用C预处理器语法,因为它已经被证明效果很好。在这样做之前,我想知道是否有更好的选择。:) 或许已经有一个cpp类似的通用预处理器可以替换掉?替换那68个文件中所有预处理器语法所需的工作量接近于重新实现预处理器所需的工作量。
我很惊讶自己依赖C预处理器做到了这么远;它对这个任务的效果比健康的头脑能理解的要好得多。我的另一个选择是静态构建Linux、Darwin-i386、Win32版本的cpp-4.1,并将这些二进制文件存储在项目的存储库中。
救命啊!