定义模块

Darafile

被依赖的模块的 Darafile 中需要加入 releases 属性,在依赖它的模块编译时才能找到对应语言所需要的包,例如 TypeScript 语言用 ts 属性告知生成器在生成时引入示例模块发布的 npm 包。

从目前的情况来看,这个应该不是必须的(2020-11-12)

  1. {
  2. "scope": "darabonba",
  3. "name": "TestModule",
  4. "version": "1.0.0",
  5. "main": "./main.tea",
  6. "releases": {
  7. "ts": "@darabonba/test-module:0.0.1"
  8. }
  9. }

main.dara

模块可以定义初始化函数 init 类似 TypeScriptJava 语言的 class 中的 constructor 函数,也可以通过 type @name = type 的方式为模块定制模块属性,该变量可在模块的 initapifunction 中使用,但不可在 static function 中使用。

  1. // 模块属性 Java中的字段
  2. type @organization = string
  3. //Java中的一个类
  4. model User{
  5. name: string,
  6. age: number
  7. }
  8. //Java中的构造方法
  9. // 模块初始化函数
  10. init(organization: string) {
  11. @organization = organization;
  12. }
  13. //静态方法
  14. static function getUser(username: string, age: number): string {
  15. var user = new User{
  16. name = username,
  17. age = age
  18. };
  19. return `user's name is ${user.name} ,user's age is ${user.age}! `;
  20. }
  21. //function和API未知
  22. function sayUserName(username: string): string {
  23. // @organization 可以在 function 中使用
  24. return `user's name is ${username}, user's organization is ${@organization}! `;
  25. }

引入模块

Darafile

在引用模块的时候,Darafile 中需要加入 libraries 属性来告诉编译器需要哪些模块,否则编译会出错。

  1. {
  2. "scope": "darabonba",
  3. "name": "Sample",
  4. "version": "1.0.0",
  5. "main": "./main.tea",
  6. "libraries": {
  7. // 属性名 TestModule dara 脚本 import 时使用的名字
  8. "TestModule": "TestModule的本地引用路径"
  9. }
  10. }

然后执行 dara install , 不能单独install某一个文件 使用dara clean 清除依赖

main.dara

在需要引入模块的 dara 脚本中,我们通过 import 关键字将 libraries 里定义的模块引入,可以通过 new 关键字得到引入模块的实例来使用模块的 apifunction,也可以直接引用其中的 modelstatic function

  1. import TestModule;
  2. type @operator = string
  3. init(operator: string) {
  4. @operator = operator;
  5. // 初始化 TestModule 模块,执行其中的 init 方法
  6. var moduleInstance = new TestModule('darabonba');
  7. // function 和 api 都只能通过模块实例调用。
  8. var sayName = moduleInstance.sayUserName('test');
  9. }
  10. static function getUserInfo(department: string): string {
  11. // 实例化 TestModule 模块中的 model
  12. var basicUserInfo = new TestModule.User{
  13. name = 'test',
  14. age = 0
  15. };
  16. // 调用 TestModule 模块中的方法
  17. var basicInfo: string = TestModule.getUser('test', 27);
  18. return `${basicInfo} he's department is ${department} `;
  19. }

继承模块

Darafile 跟之前保持一致,只需要修改 dara 文件即可。

main.dara

在需要引入模块的 dara 脚本中,我们同样通过 import 关键字模块引入,然后通过 extends 关键字继承父模块,在模块初始化函数 init 中通过 super 实例化父模块,就可以直接引用其中的 functionapi而 model 和 static function 的引用方式跟引用模块时一致。`

  1. import TestModule;
  2. extends TestModule;
  3. type @operator = string
  4. init(organization: string, operator: string) {
  5. // 调用父模块的 init 方法
  6. super(organization);
  7. @operator = operator;
  8. }
  9. static function getSubUserInfo(department: string): string {
  10. // 实例化父模块中的 model 和引用时一样
  11. var basicUserInfo = new TestModule.User{
  12. name = 'test',
  13. age = 0
  14. };
  15. // 调用父模块中的 static function 和引用时一样
  16. var basicInfo: string = TestModule.getUser('test', 27);
  17. // 直接调用父模块中的 function 和 api
  18. var sayName:string = sayUserName('test');
  19. return `${basicInfo} he's department is ${department} `;
  20. }

引用远端模块

模块仓库中找到需要的模块后,可以直接在 Darafilelibraries 属性中通过模块的 scopenameversion 来引用。

  1. {
  2. "scope": "darabonba",
  3. "name": "Sample",
  4. "version": "1.0.0",
  5. "main": "./main.tea",
  6. "libraries": {
  7. // 属性名 TestModule dara 脚本 import 时使用的名字
  8. "TestModule": "darabonba:TestModule:1.0.0"
  9. }
  10. }

Darafile 中确定了需要引入哪些模块后,接下来我们需要借助 Darabonba CLI 从远端代码仓库中拉取 libraries 中定义的模块,拉取操作如下:

  1. $ dara install

在安装完成以后,我们就可以利用安装的模块来编写我们的 dara 脚本了,与本地引用时使用一致。

  1. import TestModule;
  2. type @operator = string
  3. init(operator: string) {
  4. @operator = operator;
  5. // 初始化 TestModule 模块,执行其中的 init 方法
  6. var moduleInstance = new TestModule('darabonba');
  7. // function 和 api 都只能通过模块实例调用。
  8. var sayName = moduleInstance.sayUserName('test');
  9. }
  10. static function getUserInfo(department: string): string {
  11. // 实例化 TestModule 模块中的 model
  12. var basicUserInfo = new TestModule.User{
  13. name = 'test',
  14. age = 0
  15. };
  16. // 调用 TestModule 模块中的方法
  17. var basicInfo: string = TestModule.getUser('test', 27);
  18. return `${basicInfo} he's department is ${department} `;
  19. }

发布模块

在完成 dara 脚本的编写以后,同样可以对自己的 dara 模块进行发布。首先通过下面的命令进行登录。

  1. $ dara login

登录所用的密码账号,需要通过登录阿里云官网后跳转到 Darabonba 个人中心 进行注册。
在注册完成,并成功通过 dara login 登录以后,就可以使用下面的命令对模块进行发布了。

  1. $ dara publish

发布成功后,所有的 Darabonba 开发者都可以引用这个模块了。