<!-- 译者:Github@wizardforcel -->
# 通过服务和其它包交互 #
Atom包可以通过叫做服务的带有版本控制的APi,和其它包进行交互。在你的`package.json`文件中指定一个或者多个版本号来提供服务,每个版本号都要带有一个包的主模块中的方法。
```
{
"providedServices": {
"my-service": {
"description": "Does a useful thing",
"versions": {
"1.2.3": "provideMyServiceV1",
"2.3.4": "provideMyServiceV2",
}
}
}
}
```
在你的包的主模块中实现上面的方法。这些方法会在一个包被激活的任何时候调用,它们会使用它们的通信服务。它们应该返回实现了服务API的一个值。
```
module.exports =
activate: -> # ...
provideMyServiceV1: ->
adaptToLegacyAPI(myService)
provideMyServiceV2: ->
myService
```
与之相似,指定一个或多个[版本范围](https://docs.npmjs.com/misc/semver#ranges)来使用一个服务,每个都带有一个包的主模块中的方法。
```
{
"consumedServices": {
"another-service": {
"versions": {
"^1.2.3": "consumeAnotherServiceV1",
">=2.3.4 <2.5": "consumeAnotherServiceV2",
}
}
}
}
```
这些方法会在一个包被激活的任何时候调用,它们会提供它们的通信服务。它们会接受到一个通信对象作为一个参数。你通常需要在包提供的服务失效的时间中,进行同种类型的清除工作。从你使用服务的方法中返回一个`Disposable`来完成它:
```
{Disposable} = require 'atom'
module.exports =
activate: -> # ...
consumeAnotherServiceV1: (service) ->
useService(adaptServiceFromLegacyAPI(service))
new Disposable -> stopUsingService(service)
consumeAnotherServiceV2: (service) ->
useService(service)
new Disposable -> stopUsingService(service)
```