使用 Coffeescript 无论如何我都需要通过构建脚本来更新我的 .js 文件,我有两个,一个用于调试,一个用于生产(一个使用 Uglify 来最小化文件,一个不使用)。所以我在想,也可以方便地进行一些条件编译,代码只进入调试版本。
实现这一目标的最简单方法是什么,理想情况下由一个简单的命令行开关控制,我可以给咖啡或丑陋的东西?
使用 Coffeescript 无论如何我都需要通过构建脚本来更新我的 .js 文件,我有两个,一个用于调试,一个用于生产(一个使用 Uglify 来最小化文件,一个不使用)。所以我在想,也可以方便地进行一些条件编译,代码只进入调试版本。
实现这一目标的最简单方法是什么,理想情况下由一个简单的命令行开关控制,我可以给咖啡或丑陋的东西?
如果您正在编写构建脚本,您可以向其中添加预处理器步骤。由于 CoffeeScript 用于#
表示注释,因此 C 预处理器似乎是一个不错的选择。您可以用 s 表示调试代码#ifdef
:
some code...
#ifdef DEBUG
debug code...
#endif
然后,您可以使用 CoffeeScript预处理调试版本cpp -E -Xpreprocessor -DDEBUG <filename> -o <outfile>
并进行编译。<outfile>
同样,使用cpp -E <filename> -o <outfile>
.
编辑:这很难,因为这意味着任何未缩进的 CoffeeScript 注释都会破坏预处理步骤。不知道这对你有多大的问题。例如,
code...
#comment about the code
会破坏构建,但是
code...
indented code...
#indented comment
可以正常工作,因为预处理器不会查看行,除非它们的第一个字符是#
.
这听起来像你说你有两个构建脚本?对于string.js,我只是使用 Cakefile 来实现你我认为你想要的。本质上,如果源文件发生变化,它会生成一个常规的 JS 文件,然后是一个 uglified 文件。
这是Cakefile的相关部分:
task 'watch', 'Watch src/ for changes', ->
browserTestFile = path.join(process.cwd(), 'test_browser', 'string.test.js')
coffee = spawn 'coffee', ['-w', '-c', '-o', 'lib', 'src']
coffee.stderr.on 'data', (data) -> 'ERR: ' + process.stderr.write data.toString()
coffee.stdout.on 'data', (data) ->
d = data.toString()
if d.indexOf('compiled') > 0
#invoke 'test'
fsw = fs.createWriteStream(browserTestFile, flags: 'w', encoding: 'utf8', mode: 0666)
coffee_test = spawn 'coffee', ['-c', '-p', 'test/string.test.coffee']
coffee_test.stdout.pipe(fsw, end: false)
uglify = spawn 'uglifyjs', ['lib/string.js']
uglify.stdout.pipe(fs.createWriteStream('lib/string.min.js'))
else
growl(d, title: 'Error', image: './resources/error.png')
process.stdout.write data.toString()
我对这种事情使用https://github.com/jsoverson/grunt-preprocess 。它完全符合我正在尝试做的事情:
detect_ennemy_collision: (ennemies) ->
# @ifdef DEBUG
expect(ennemies).to.be.an 'array'
expect(ennemies.length).to.be.ok
for ennemy in ennemies
(expect ennemy).to.be.an.instanceof Character
# @endif
#...