通过服务和其它包交互

Atom包可以通过叫做服务的带有版本控制的APi,和其它包进行交互。在你的package.json文件中指定一个或者多个版本号来提供服务,每个版本号都要带有一个包的主模块中的方法。

  1. {
  2. "providedServices": {
  3. "my-service": {
  4. "description": "Does a useful thing",
  5. "versions": {
  6. "1.2.3": "provideMyServiceV1",
  7. "2.3.4": "provideMyServiceV2",
  8. }
  9. }
  10. }
  11. }

在你的包的主模块中实现上面的方法。这些方法会在一个包被激活的任何时候调用,它们会使用它们的通信服务。它们应该返回实现了服务API的一个值。

  1. module.exports =
  2. activate: -> # ...
  3. provideMyServiceV1: ->
  4. adaptToLegacyAPI(myService)
  5. provideMyServiceV2: ->
  6. myService

与之相似,指定一个或多个版本范围来使用一个服务,每个都带有一个包的主模块中的方法。

  1. {
  2. "consumedServices": {
  3. "another-service": {
  4. "versions": {
  5. "^1.2.3": "consumeAnotherServiceV1",
  6. ">=2.3.4 <2.5": "consumeAnotherServiceV2",
  7. }
  8. }
  9. }
  10. }

这些方法会在一个包被激活的任何时候调用,它们会提供它们的通信服务。它们会接受到一个通信对象作为一个参数。你通常需要在包提供的服务失效的时间中,进行同种类型的清除工作。从你使用服务的方法中返回一个Disposable来完成它:

  1. {Disposable} = require 'atom'
  2. module.exports =
  3. activate: -> # ...
  4. consumeAnotherServiceV1: (service) ->
  5. useService(adaptServiceFromLegacyAPI(service))
  6. new Disposable -> stopUsingService(service)
  7. consumeAnotherServiceV2: (service) ->
  8. useService(service)
  9. new Disposable -> stopUsingService(service)