dart包的创建

news2024/11/14 16:11:08

浅讲dart包(Packages)的创建

创建 package

在 Dart 生态系统中使用 packages 实现共享软件,比如一些库和工具。本章将通过最常见的 Package 来介绍如何创建一个 Package。

若要为 package 创建一个初始化的目录和结构,使用 dart create 命令,并加入 package 作为命令参数来创建:

$ dart create -t package <PACKAGE_NAME>

Package 的组成

下图展示了最简单的 Package 的结构:

root directory contains pubspecyaml and lib/filedart

Package 的最基本要求包括:

  • pubspec 文件
    Package 的 pubspec.yaml 文件与应用程序的 pubspec.yaml 文件相同— pubspec.yaml 文件中并没有特别的指出这个 Package 是一个库。

  • lib 目录
    如你所料,库的代码位于 lib 目录下,且对于其他 Package 是公开的。你可以根据需要在 lib 下任意创建组织文件结构。按照惯例,实现代码会放在 lib/src 目录下。 lib/src 目录下的代码被认为是私有的。其他 Package 应该永远不需要导入 src/... 目录下代码。通过导出 lib/src 目录的文件到一个 lib 目录的文件,实现对 lib/src 目录中 API 的公开。

  • 常用做法为在src中实现api,然后通过export导出需要公开的api

组织 Package 的代码结构

在创建一个小的,独立的 Package 时(称之为 Mini Library),它非常容易维护,扩展和测试。大多数情况下,除非存在两个类紧密耦合的情况,否则每个类都应该将自己视为一个 Mini Library 。

info 备注:

在文件的头部使用 part 命令,能够将一个 Library 分割成多个 Dart 文件。这里,我们建议应该创建 Mini Library ,而避免使用 part 命令。

直接在 lib 目录下创建“主” Library 文件,lib/**.dart,该文件导出所有的公开的 API 。这样就可以允许使用者导入单个文件就能够获得 Library 的所有功能。

lib 目录还可能包含其他可导入的非 src 代码。例如,主 Library 可能是跨平台的,但创建的独立 Library 依赖于 dart:io 或 dart:html 。 Some packages have separate libraries that are meant to be imported with a prefix, when the main library is not.(无法确切理解含义,暂未翻译)

这里让我们来看下一个真实 Library Package 的组织结构:shelf 。 shelf Package 提供了一种使用 Dart 创建 Web 服务器的简便方法,它是一种 Dart Package 的常用结构:

shelf root directory contains example, lib, test, and tool subdirectories

主 Library 文件 shelf.dart 在 lib 目录下,通过 shelf.dart 文件导出 lib/src 目录下的若干文件。为了不导出过多的 API,并且为开发者提供公开的 API 的概览, shelf.dart 使用了 show 来指定哪些内容需要导出:

export 'src/cascade.dart' show Cascade;
export 'src/handler.dart' show Handler;
export 'src/hijack_exception.dart' show HijackException;
export 'src/middleware.dart' show Middleware, createMiddleware;
export 'src/middleware/add_chunked_encoding.dart' show addChunkedEncoding;
export 'src/middleware/logger.dart' show logRequests;
export 'src/middleware_extensions.dart' show MiddlewareExtensions;
export 'src/pipeline.dart' show Pipeline;
export 'src/request.dart' show Request;
export 'src/response.dart' show Response;
export 'src/server.dart' show Server;
export 'src/server_handler.dart' show ServerHandler;

在 shelf Package 中同样包含了 Mini Library:shelf_io 。适配器用来处理来自 dart:io 的 HttpRequest 对象。

tips_and_updates 小提示:

为了在开发时使 dartdevc 工具能够达到最佳新能,应该将 实现文件 放到目录 /lib/src 下,而不是 /lib 目录的其他地方。另外,避免通过 package:*package_name*/src/... 导入文件。

导入库文件

在从其他 package 导入库文件时,使用 package: 命令来指定文件的 URI 。

import 'package:utilities/utilities.dart';

在两个文件都在 lib 目录中,或两个文件都在 lib 目录外,我们都可以使用相对路径的方式导入 Library 。但是,如果两个文件不都在 lib 目录中,需要对 lib 内或者 lib 外进行查找,那么此时必须要使用 package: 导入。如果对当前使用存在疑惑,那么直接 package: ; package: 满足所有情况。

下面图片展示分别从 lib 和 web 目录中导入 lib/foo/a.dart 。

lib/bar/bdart uses a relative import; web/maindart uses a package import

条件导入或条件导出 Library 文件

如果你的 library 支持多平台,那么你应该会用到条件导入或条件导出 library 文件。常见的用例是,一个库同时支持 Web 和 Native 平台。

为了使用条件导入或条件导出,你需要检查是否存在 dart:* 库。下面是一个条件导出代码的样例,它将检查是否存在 dart:io and dart:html 库:

export 'src/hw_none.dart' // Stub implementation
    if (dart.library.io) 'src/hw_io.dart' // dart:io implementation
    if (dart.library.html) 'src/hw_html.dart'; // dart:html implementation

lib/hw_mp.dart

该代码的作用如下:

  • 在一个可以使用 dart:io 的 app 中(例如一个命令行应用),导出 src/hw_io.dart

  • 在一个 web 应用中可以使用 dart:html 导出 src/hw_html.dart

  • 若是其他情况,则导出 src/hw_none.dart

要条件导入一个文件可以使用和上面一样的方式,仅需将 export 改为 import 即可。

info 备注:

条件导入或条件导出仅检查该库在当前平台上_是否可用_,而不管是实际导入还是使用。

所有条件导出的库必须实现相同的 API。下面是 dart:io 实现的一个例子:

import 'dart:io';

void alarm([String? text]) {
  stderr.writeln(text ?? message);
}

String get message => 'Hello World from the VM!';

lib/src/hw_io.dart

这是一个默认实现,它会导致抛出 UnsupportedErrors

void alarm([String? text]) => throw UnsupportedError('hw_none alarm');

String get message => throw UnsupportedError('hw_none message');

lib/src/hw_none.dart

在任何平台上,你都可以导入具有条件导出代码的库:

import 'package:hw_mp/hw_mp.dart';

void main() {
  print(message);
}

提供额外文件

一个设计良好的 Package 很容易被测试。我们建议使用 test Package 编写测试用例,并将测试代码放到 Package 根目录的 test 目录中。

如果要创建一个公用的命令行工具,应该将这些工具放到公共目录 bin 中。使用 dart pub global activate 命令行来运行工具。在 pubspec 的 executables 部分 列出的工具允许用户直接运行它而无需调用 dart pub global run。

在 Library 中包含一个 example 程序演示如何使用 Library 是非常有用的。 example 程序在 Package 根目录的 example 目录中。

在开发过程中任何非公开的工具或可执行程序,应该放到 tool 文件夹。

如果要将 Library 发布到 Pub 网站还要求一些其他的文件来描述 发布的 Package ,例如:README.md 和 CHANGELOG.md 文件。更多关于如何组织 Package 目录的内容,参见 Pub Package 布局约定。

为 Library 制作文档

使用 [dartdoc][] 可以为 Library 生成 API 文档。 dartdoc 解析源文件去查找使用 /// 语法标注的 文档注释:

/// The event handler responsible for updating the badge in the UI.
void updateBadge() {
  ...
}

文档生成示例,参见 shelf 文档。

若要自动生成任何库级别的文档,请添加一个 library 指令并直接在其上方附加注释。更多详情,请参阅文档 Effective Dart: Documentation。

分发开源 Library

如果 Library 是开源的,我们建议将他共享到 Pub 网站。使用 pub publish 来发布或者更新 Library,该命令将会上传 Package 并创建或更新其页面。示例参见 shelf Package 页面。有关如何准备发布 Package 的详细内容,参见 发布 Package。

Pub.dev 网站不仅仅是 Dart Packages 的发布网站, Pub 网站不仅用于托管 Package ,还能够生成托管 Package 的 API 参考文档。最新生成的文档的链接位于 Package 的 About 选项卡中; 示例参见 shelf Package 的 API 文档。链接到以前版本的文档,位于 Package 页面的 Versions 选项卡中。

为了确保 Package 的 API 文档在 Pub 网站上看起来更美观,请遵循以下步骤:

  • 在发布 Package 前,请通过执行 dart doc 工具确保文档能够生成成功且符合预期。

  • 在发布 Package 后,请检查 Versions 选项卡,确保文档生成成功。

  • 如果文档没有生成,点击 Versions 选项卡中的 failed 查看 dartdoc 的输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1013670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库技术笔记(2)

对于数据库表中列的增加的命令 : alter table 表名 add 列名 数据类型 [first|after 指定的列名 ] ; 例如 : 在 student 表中增加一列家庭地址&#xff0c;排列在手机号这一列的后面。 alter table student add address varchar(100) after phone; 调整数据库表中列的顺序…

王道数据结构C语言循环链表基本操作实现

文章目录 一、循环单链表1.1初始化及判空操作1.2判断是否是尾结点 二、循环双链表2.1初始化2.2判空2.3判断尾结点2.4循环双链表的删除 一、循环单链表 1.1初始化及判空操作 其实循环链表就是在单链表&#xff08;双链表&#xff09;上做一点小小的优化 它是把尾结点的next指…

广西建筑模板施工中的常见问题及解决方法

广西建筑模板施工中的常见问题及解决方法在广西建筑模板的施工过程中&#xff0c;可能会出现一些常见的质量问题。以下是常见问题及其解决方法&#xff0c;以帮助您更好地处理这些问题。 1. 透胶问题&#xff1a;透胶是指模板中出现胶水渗透的现象。可能的原因包括单板质量差、…

设备树的理解与运用

设备树&#xff1a; 本质是一个文件&#xff0c;包含很多节点&#xff0c;每个节点里边是对设备属性的描述&#xff08;包括GPIO&#xff0c;时钟&#xff0c;中断等等&#xff09;,其中节点&#xff08;node&#xff09;和属性&#xff08;property&#xff09;就是设备树最重…

mysql数据库数据如何迁移目录

目录 1.关闭正在运行mysql2.找到本机my.ini 文件3.观察目录结构4.复制注意是复制Data文件夹到目的地5.找到my.ini初始位置修改数据路径并保存6.启动mysql7.关注my.ini 常用配置 1.关闭正在运行mysql 2.找到本机my.ini 文件 默认位置 C:\ProgramData\MySQL\MySQL Server 8.0 …

如果你是独立开发者,你是先写前端还是先写后端?

当我们站在独立开发的路口时&#xff0c;一个重要的抉择就摆在了我们面前&#xff1a;是先着手前端开发还是后端开发&#xff1f;这看似简单的问题&#xff0c;却蕴含着许多深刻的考虑和决策。无论你是准备构建一个复杂的分布式系统还是一个引人入胜的用户界面&#xff0c;接下…

LeetCode每日一题:1462. 课程表 IV(2023.9.12 C++)

目录 1462. 课程表 IV 题目描述&#xff1a; 实现代码与解析&#xff1a; 拓扑排序 原理思路&#xff1a; 1462. 课程表 IV 题目描述&#xff1a; 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff…

分布式文件系统对比与选型参考

目录 一、分布式文件系统 1、 数据的存储方式&#xff1a; 2、 数据的读取速率 3、 数据的安全机制 二、主流分布式文件系统介绍 1. GFS&#xff08;Google File System&#xff09; 2. HDFS&#xff08;Hadoop Distributed File System&#xff09; 3. Ceph …

java在mysql中查询内容无法塞入实体类中,报错 all elements are null

目录 一、问题描述二、解决方案 一、问题描述 java项目中整体配置了mysql的驼峰式字段匹配规则。 mybatis.configuration.map-underscore-to-camel-casetrue由于项目需求&#xff0c;需要返回字段为file_id&#xff0c;file_url&#xff0c;并且放入实体类中&#xff0c;实体…

对话大模型中的情感支持及商业化落地

在1982年经典科幻电影《银翼杀手》中&#xff0c;仿生人瑞秋因为被植入记忆而以为自己是真人&#xff0c;当被告知自己是仿生人时&#xff0c;她拒绝相信&#xff0c;流下了眼泪。如今&#xff0c;随着AI领域对话大模型技术的发展&#xff0c;“比人更像真人”的人工智能正从梦…

vue实现左右伸缩(el-drawer自定义位置展开收缩)

内容左右收缩展开 实现需求实现效果自定义抽屉(el-drawer)展开位置实现原理 js方法&#xff0c;点击的时候抽屉伸缩展开&#xff0c;并且给左侧右侧内容对应的宽度第二种方法 实现需求 页面内容是左右布局&#xff0c;需求想让左侧内容可收缩&#xff0c;然后展示完全右侧内容。…

模拟经营类游戏是怎么开发的?

模拟经营类游戏开发是一个充满挑战但也充满乐趣的领域。下面是一些步骤和关键考虑因素&#xff0c;可以帮助您开始开发自己的模拟经营游戏&#xff1a; 明确游戏概念&#xff1a; 确定游戏开发的主题和类型&#xff0c;例如城市建设、农场经营、餐厅经营等。 制定一个引人入胜…

《论文阅读》通过动态融入常识知识来提高同理心对话的生成

《论文阅读》通过动态融入常识知识来提高同理心对话的生成 前言简介模型架构Contextual ProbingContextual Unification Workspace代码实现Knowledge-Aware Decoder实验结果前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到…

文件路径中的/,\的区别和文件路径的常见用法

/是Unix和类Unix系统上的路径分隔符.现代Windows通常可以同时使用\和/交换文件路径,但微软\几十年来一直主张使用路径分隔符. 关于文件路径的常用方法再学习一下&#xff1a; "./"&#xff1a;代表目前所在的目录 "../"&#xff1a;代表上一层目录 以&q…

如何在Blender中压缩/减小GLTF模型的大小

GLTF 如何在Blender中压缩/减小GLTF模型的大小 Blender是一款功能强大的开源软件&#xff0c;旨在创建3D图形&#xff0c;动画和视觉效果。它支持多种文件格式的导入和导出&#xff0c;包括GLB&#xff0c;GLTF&#xff0c;DAE&#xff0c;OBJ&#xff0c;ABC&#xff0c;USD…

CAD批量转换低版本怎么转?教你一看就会的转换方法

CAD文件需要转换版本是因为不同版本的CAD软件可能不兼容。这意味着&#xff0c;如果在一个版本的CAD软件中创建了一个文件&#xff0c;可能无法在另一个版本的CAD软件中打开它。这可能会导致数据丢失或格式错误。 为了避免这种情况&#xff0c;需要将CAD文件转换为适当的版本以…

短视频seo矩阵系统源码开发与部署全解析

在这个数字化快速发展的时代&#xff0c;短视频已经成为人们获取娱乐&#xff0c;学习&#xff0c;商业信息的主要途径之一。对于企业来说&#xff0c;利用短视频矩阵进行高效且精准的营销推广&#xff0c;无疑是一个重要的战略方向。本文将详细介绍如何进行短视频矩阵源码的开…

【开源】无忧企业文档文库管理界面介绍

无忧企业文档是软开企服研发的一款集知识库、网盘、在线协同为一体的企业级办公软件&#xff0c;有完全免费的开源版&#xff0c;也有功能丰富的商业版。开源版在社区开放了全量源码&#xff0c;商业版支持提供源码&#xff0c;支持二次开发&#xff0c;适合中小企业使用。 文…

企业如何简化线上营销服务流程,让服务更通畅?

在线客服是现代企业服务的重要组成部分&#xff0c;在线客服的质量在很大程度上决定客户的满意度和忠诚度。企业如何简化线上营销服务流程&#xff0c;让服务更通畅&#xff1f;本文将就此探讨。 一、建立流程管理体系 在线上营销服务中&#xff0c;建立流程管理体系可以帮助企…