我正在处理一个用coffeescript编写的包,它最终会使用api.export
将变量导出到应用程序范围(IE我希望这个变量可以在安装此包的任何应用程序中访问) 。 This site发表以下声明(引用):
- 普通根级别符号是文件范围的,即在包的其他文件中不可见
- 以@开头的符号是包全局变量,即在包的所有文件中都可见。
- 导出的符号在包的所有文件和应用程序代码中都可见。但不能以@ -character开头。
但是,在将此变量导出到应用程序范围之前,我想在此变量中添加一些内容,并且这些操作需要在单独的文件中进行。为了解决这个问题,我试图创建一个包范围变量,修改它,然后在文件范围上创建一个变量,该变量是同一个对象的别名,并导出该变量。这样,我可以在包范围内进行编辑,但我仍然在应用程序范围内拥有导出的变量。
为了模拟这一点,我创建了this small git repository三个类:Base,ClientDeriv和ServerDeriv。 Base位于lib
目录中,ClientDeriv
和ServerDeriv
分别位于client
和server
目录中。
lib / Base.coffee (参见编辑:此文件已略有更新)
class @CoffeePackageHandle.Base #this should create a package level variable with this class attatched
constructor: (@isBase) ->
return true
CoffeePackageHandle = @CoffeePackageHandle #this is a file scope variable, but we'll use api.export
#make this available in the final app
的客户机/ client-deriv.coffee
class @CoffeePackageHandle.ClientDeriv extends @CoffeePackageHandle.Base
constructor: (@catchPhrase) ->
return "I'm on the client, I'm a giant!"
服务器/ server-deriv.coffee
class ServerDeriv extends CoffeePackageHandle.Base
constructor: (@catchprhase) ->
return "I'm on the server, I like hamburgers!"
package.js
Package.describe({
summary: "Test of making packages with coffeescript!"
});
Package.on_use(function(api, where) {
api.use('coffeescript', ['client', 'server']);
api.add_files([
'lib/base.coffee',
'client/client-deriv.coffee',
'server/server-deriv.coffee'],
['client', 'server']);
api.export('Coffee-Package-Handle', ['client', 'server']);
});
应用程序几乎开始,但后来我收到以下错误(不再获取此信息,请参阅下面的编辑):
W20140421-14:56:29.607(-4)? (STDERR)
W20140421-14:56:29.611(-4)? (STDERR) /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:186
W20140421-14:56:29.613(-4)? (STDERR) }).run();
W20140421-14:56:29.613(-4)? (STDERR) ^
W20140421-14:56:29.622(-4)? (STDERR) TypeError: Cannot set property 'Base' of undefined
W20140421-14:56:29.623(-4)? (STDERR) at lib/base.coffee:1:27
W20140421-14:56:29.623(-4)? (STDERR) at app/lib/base.coffee.js:16:3
W20140421-14:56:29.623(-4)? (STDERR) at /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:155:10
W20140421-14:56:29.624(-4)? (STDERR) at Array.forEach (native)
W20140421-14:56:29.625(-4)? (STDERR) at Function._.each._.forEach (/home/AD/arst238/.meteor/tools/c2a0453c51/lib/node_modules/underscore/underscore.js:79:11)
W20140421-14:56:29.625(-4)? (STDERR) at /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:82:5
这是一个简单的测试包,但在我的实际包中我经常会遇到这个错误(这个简单的测试包中也出现了一段时间):
W20140421-14:28:48.330(-4)? (STDERR) /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:186
W20140421-14:28:48.331(-4)? (STDERR) }).run();
W20140421-14:28:48.332(-4)? (STDERR) ^
W20140421-14:28:48.332(-4)? (STDERR) TypeError: Object #<Object> has no method 'describe'
W20140421-14:28:48.333(-4)? (STDERR) at app/package.js:1:44
W20140421-14:28:48.335(-4)? (STDERR) at app/package.js:14:3
W20140421-14:28:48.336(-4)? (STDERR) at /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:155:10
W20140421-14:28:48.336(-4)? (STDERR) at Array.forEach (native)
W20140421-14:28:48.336(-4)? (STDERR) at Function._.each._.forEach (/home/AD/arst238/.meteor/tools/c2a0453c51/lib/node_modules/underscore/underscore.js:79:11)
W20140421-14:28:48.337(-4)? (STDERR) at /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:82:5
我不确定我做了什么导致这些错误,或者为什么有时我会得到一个而不是另一个。任何帮助将不胜感激!
修改
我可能已经解决了第一个错误,但该解决方案让我仍然遇到第二个错误(TypeError: Object #<Object> has no method 'describe'
)错误。解决方案是添加生产线
@CoffeePackageHandle = {}
到lib/base
的开头。然后,如果从项目中删除package.js
,则应用程序将正确编译并启动。使用package.js
,我仍然遇到第二个错误。将更改存储库以反映这些更改。