dart项目规范

dart项目结构

假设有一个名称为 enchilada 的完整的包目录(基本用到了所有的子目录),那么它的目录结构看起来像下面这样:

enchilada/ .dart_tool/ * .packages * pubspec.yaml pubspec.lock ** LICENSE README.md CHANGELOG.md benchmark/ make_lunch.dart bin/ enchilada doc/ api/ *** getting_started.md example/ main.dart lib/ enchilada.dart tortilla.dart guacamole.css src/ beans.dart queso.dart test/ enchilada_test.dart tortilla_test.dart tool/ generate_docs.dart web/ index.html main.dart style.css

  • .dart_tool 和 .packages 是由pub get 生成的,不需要纳入版本管理;

** pubspec.lock 也是由 pub get 命令生成的,除非你的包是应用程序包,否则也不建议纳入版本管理; 

*** doc/api 目录是有dartdoc命令运行后生成的。不要纳入版本管理。

关于pubspec(dart的项目依赖管理)

enchilada/pubspec.yamlpubspec.lock

所有包都有 pubspec, 一文件命名为 pubspec.yaml,在整个包的根目录,这是使包成为包的关键文件.使用dart pub get, dart pub upgrade, or dart pub downgrade 在包下会创建 lockfile即项目依赖锁,  名为pubspec.lock.如果你的程序是一个应用程序包(application package),那把pubspec.lock文件放入到发布的源代码中,不然不要.

想知道更多的话, 请看 pubspec page.

LICENSE-许可证

enchilada/LICENSE

如果你打算发布你的包,包含一个许可证叫做LICENSE.我们推荐使用OSI-approved license such as BSD-3-Clause, 好让他人可以使用你的项目继续开发(在中国别这么干).

README.md

enchilada/README.md

在开源项目中非常出名的文件README 描述整个项目.这在pub社区中尤为重要.当你上传你的项目到 pub.dev site, 你的README.md 将会被—以Markdown的形式加载—在你发布的包的页面.这个文件会向人们完美的介绍你的项目. 

想要知道怎么写出更棒的README,查看Writing package pages.

CHANGELOG.md

enchilada/CHANGELOG.md

包含一个 CHANGELOG.md 文件,其中包含每个软件包版本的部分,以及帮助软件包用户升级的注释。 软件包的用户经常查看更改日志以发现错误修复和新功能,或者确定升级到软件包的最新版本需要花费多少精力。

要支持解析 CHANGELOG.md 的工具,请使用以下格式:

  • 每个版本都有自己的带有标题的部分。
  • 版本标题要么全部为 1 级,要么全部为 2 级。
  • 版本标题文本包含包版本号,可以选择添加前缀“v”。

当你把包上传到pub.dev site, 你包的CHANGELOG.md 文件(有的话) 会出现在 Changelog 标签中, 以 Markdown 形式加载.https://pub.flutter-io.cn/packages/markdown

这是个CHANGELOG.md 的例子. 如示例所示,您可以添加小版本号。

# 1.0.1* Fixed missing exclamation mark in `sayHi()` method.# 1.0.0* **Breaking change:** Removed deprecated `sayHello()` method.
* Initial stable release.## Upgrading from 0.1.xChange all calls to `sayHello()` to instead be to `sayHi()`.# 0.1.1* Deprecated the `sayHello()` method; use `sayHi()` instead.# 0.1.0* Initial development release.

Public- 公共目录

您的包中的两个目录对其他包是公开的:lib and bin.。 您将public libraries(公共库) 放在 lib 中,将public tools(公共工具)放在 bin 中。

Public lib-公共库

以下目录结构显示 enchilada 的 lib 部分:

enchilada/lib/enchilada.darttortilla.dart

许多包(packages)定义了其他包可以导入和使用的 Dart 库。 这些公共 Dart 库文件位于名为 lib 的目录中。

大多数包定义了单个库以供用户导入。 在这种情况下,其名称通常应与包的名称相同,例如此处示例中的 enchilada.dart。 但您也可以使用对您的包有意义的任何名称来定义其他库。

当您这样做时,用户可以使用包的名称和库文件导入这些库,如下所示:

import 'package:enchilada/enchilada.dart';
import 'package:enchilada/tortilla.dart';

如果您想组织你的公共库,您还可以在 lib 内创建子目录。 如果这样做,用户将在导入时指定该路径。 假设您有以下文件层次结构:

enchilada/lib/some/path/olives.dart

用户导入 olives.dart,如下所示:

import 'package:enchilada/some/path/olives.dart';

请注意,只有库才应位于 lib 中。 入口点——带有 main() 函数的 Dart 脚本——不能进入 lib。 如果您将 Dart 脚本放入 lib 中,您会发现它包含的任何 package: 导入都无法解析。 相反,您的入口点应该位于适当的入口点目录( entrypoint directory)中。

info 针对网络应用程序的提示:为了在开发网络应用程序时获得最佳性能,请将实现文件( implementation files)放在 /lib/src 下,而不是放在 /lib 下的其他位置。 另外,避免导入 package:package_name/src/...

想知道关于packages的更多信息, 查看Creating packages.

Public tools-公共工具

放置在 bin 目录内的 Dart 脚本是公开的。 如果您位于包的目录中,你可以用 dart run 在任何导入了这个包中的包中运行bin中的脚本.

在任何目录中, 你可用 run scriptszaidart pub global activate.

如果您打算依赖您的包,并且希望您的脚本对您的包是私有的,请将它们放在顶级工具目录中。 如果您不希望您的包被依赖,您可以将脚本留在 bin 中。

Public assets-公共资源目录

enchilada/lib/guacamole.css

当大多数包让你去复用dart代码时,你还可以复用其他类型的内容.打个比方,一个关于Bootstrap的包可能含有大量的CSS文件让开发者去使用.

这些位于顶lib目录的顶层中。 您可以将任何类型的文件放入其中,并按照您喜欢的方式使用子目录对其进行组织。

Implementation files-内部公共库实现即源码(src)目录

enchilada/lib/src/beans.dartqueso.dart

src目录是针对自己的lib中公共库文件的代码实现,即开发者所要编写的源代码.

lib 内的库是公开可见的:其他包可以自由导入它们。 但包的大部分代码都是内部实现库,只能由包本身导入和使用。 它们位于名为 src 的 lib 子目录中。 如果可以帮助您组织内容,您可以在其中创建子目录。

您可以自由地从同一包中的其他 Dart 代码中导入位于 lib/src 中的库(如 lib 中的其他库、bin 中的脚本和测试),但绝对不应该从另一个包的 lib/src 目录中导入。 这些文件不是包的公共 API 的一部分,它们的更改可能会破坏您的代码。

如何从自己的包中导入库取决于库的位置:

  • 当reaching inside or outside lib/ (lint: avoid_relative_lib_imports){在lib目录内或者外部时可使用package}, use package:.
  • 其他情况下, prefer relative imports(用相对路径).

举例:

// When importing from lib/beans.dart
import 'src/beans.dart';// When importing from test/beans_test.dart
import 'package:enchilada/src/beans.dart';

您在此处使用的名称(在本例中为 enchilada)是您在 ​​​​​​pubspec中为包指定的名称。

Web files

enchilada/web/index.htmlmain.dartstyle.css

对于 Web 包,请将入口点代码(包含“main()”和支持文件(例如 CSS 或 HTML)的 Dart 脚本)放置在“web”下。 如果您愿意,您可以将“web”目录组织成子目录。

把library code放置到lib目录下,

Put library code under lib.如果该库不是通过“web”下的代码或其他包直接导入的,请将其放在“lib/src”下. 把 web-based examples 放到example目录下`. 查看Public assets来获取放置公共资源的提示,像是图片.

Command-line apps-命令行工具

enchilada/bin/enchilada

一些包定义了可以直接从命令行运行的程序。 这些可以是 shell 脚本或任何其他脚本语言,包括 Dart。

如果您的包定义了这样的代码,请将其放入名为“bin”的目录中。 如果您使用以下命令 dart pub global进行设置,则可以从命令行上的任何位置运行该脚本.

Tests and benchmarks-测试和性能测试

enchilada/test/enchilada_test.darttortilla_test.dart

Every package should have tests. With pub, the convention is that these go in a test directory (or some directory inside it if you like) and have _test at the end of their file names.

每个包都应该有测试。 对于 pub,惯例是这些文件位于“test”目录中(如果您愿意,也可以在其中的某个目录中),并在文件名末尾添加“_test”。

通常,这些使用 test 包.

enchilada/benchmark/make_lunch.dart

具有性能关键代码的软件包还可能包括基准测试代码。 这些测试 API 不是为了正确性,而是为了速度(或内存使用,或者可能是其他经验指标)。

Documentation-文档

enchilada/doc/api/getting_started.md

如果您有代码和测试,那么您可能需要的下一部分是良好的文档。 它位于名为“doc”的目录中。

当你使用dart doc 工具时, 它会替代已经生成的api接口文档说明, 默认, 放置在 doc/api.

自API文档可以从源代码生成,你不应当将文档放入发布的源代码中.

除了生成的“api”之外,我们没有任何关于您编写的文档的格式或组织的指南。 使用您喜欢的任何标记格式。

Examples-示例代码

enchilada/example/main.dart

代码、测试、文档,您的用户还想要什么? 当然,使用您的包的独立示例程序! 它们位于“example”目录中。 如果示例很复杂并且使用多个文件,请考虑为每个示例创建一个目录。 否则,您可以将每个都放在“example”中。

在您的示例中,使用“package:”从您自己的包中导入文件。 这可以确保包中的示例代码看起来与包外部的代码完全相同。

如果您可能发布包,请考虑使用以下名称之一创建示例文件::

  • example/example[.md]
  • example[/lib]/main.dart
  • example[/lib]/*package_name*.dart
  • example[/lib]/*package_name*_example.dart
  • example[/lib]/example.dart
  • example/README[.md]

当您发布包含一个或多个上述文件的包时,pub.dev 网站会创建一个示例选项卡来显示它找到的第一个文件(按上面列表中显示的顺序搜索)。 例如,如果您的包的“example”目录下有许多文件,其中包括一个名为“README.md”的文件,那么您的包的“Example”选项卡将显示“example/README.md”的内容(解析为“[Markdown”。)] (markdown | Dart Package "Markdown.)")

Internal tools and scripts-内部自定义工具

enchilada/tool/generate_docs.dart

成熟的软件包通常很少有人们在开发软件包本身时运行的帮助脚本和程序。 想想测试运行器、文档生成器或其他自动化功能。

与“bin”中的脚本不同,这些脚本适合包的外部用户。 如果您有其中任何一个,请将它们放在名为“tool”的目录中。

Project-specific caching for tools-特定于项目的工具缓存

*注意 不要将.dart_tool/目录签入源代码管理。 相反,请将“.dart_tool/”保留在“.gitignore”中。

.**dart_tool**/ 目录是在您运行 **dart pub get** 时创建的,并且可能随时被删除。 各种工具使用此目录来缓存特定于您的项目和/或本地计算机的文件。 .**dart_tool**/ 目录永远不应该被签入源代码管理系统,或者在机器之间复制。

删除.dart_tool/目录通常也是安全的,尽管某些工具可能需要重新计算缓存的信息。

示例: dart pub get 工具会将依赖项下载并提取到全局目录$PUB_CACHE ,然后编写一个.dart_tool/package_config.json文件将包名称映射到全局$PUB_CACHE目录中的目录。 .dart_tool/package_config.json 文件由其他工具(例如分析器和编译器)在需要解析诸如 import 'package:foo/foo.dart' 之类的语句时使用。

在开发需要特定于项目的缓存的工具时,您可以考虑使用“.dart_tool/”目录,因为大多数用户已经使用“.gitignore”忽略它。 在用户的“.dart_tool/”目录中缓存工具文件时,您应该使用唯一的子目录。 为了避免冲突,为名为“”的包保留了“.dart_tool//”形式的子目录。 如果您的工具不是通过pub.dev 网站 分发的,您可以考虑发布一个占位符包,以保留唯一的 姓名。

示例: package:build 提供了用于编写代码生成步骤的框架。 运行这些构建步骤时,文件会缓存在“.dart_tool/build/”中。 这有助于加快构建步骤的未来重新运行。

report_problem 请注意: 开发想要在.dart_tool/中缓存文件的工具时,请确保以下几点:

  • 您正在使用以您拥有的包命名的子目录(.dart_tool/<my_tool_package_name>/
  • 您的文件不属于源代码管理,因为“.dart_tool/”通常列在“.gitignore”中

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

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

相关文章

【LeetCode每日一题】——面试题10.11.峰与谷

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 排序 二【题目难度】 中等 三【题目编号】 面试题10.11.峰与谷 四【题目描述】 在一个整数…

灰度变换原理//test later

灰度变换原理 图像灰度变换变换原理&#xff1a;通过变换函数T将原图像像素灰度值r映射为灰度值s&#xff1a; 2、灰度反转 2.1原理 灰度反转&#xff1a;将图像亮暗对调&#xff0c;可以增强图像中暗色区域细节 &#xfffd;&#xfffd;(&#xfffd;)&#xfffd;−1−…

【C++】哈希表的实现

哈希是什么理解哈希哈希所用的容器计算key值方法哈希的插入和查找解决哈希冲突闭散列也叫开放寻址法开散列 哈希闭散列实现闭散列结构闭散列结构插入闭散列查找闭散列删除 哈希开散列实现&#xff08;链表式&#xff09;开散列结构开散列结构插入开散列结构查找开散列结构删除 …

Map和Set及其实现类详解

目录 一, 搜索 1,传统搜索 2,Map和Set模型 二, Map的使用 1,Map接口的继承及实现图 2,Map接口的使用 3,TreeMap和HashMap的使用和对比 1,TreeMap 代码示例 map中插入的数据按照key进行排序 map中插入的数据必须具有可比较性(或者实现了比较器相关接口) ​map中插入…

Echarts 折线图的详细配置过程

文章目录 折线图 简介配置步骤简易示例 折线图 简介 Echarts是一款基于JavaScript的开源可视化库&#xff0c;由百度开发和维护。它提供了丰富多样的图表类型&#xff0c;其中折线图是其中一种常用的图表类型。 折线图通过连接数据点所形成的折线来展示数据的变化趋势。在折线…

互联网3.0 数字原生——数物虚实多维细粒度泛在融合

随着计算机、宽带网、通信技术的飞速发展&#xff0c;互联网技术和软硬件系统也不断演进&#xff0c;催生了一场前所未有的数字化革命。从Web1.0到Web3.0&#xff0c;以及虚拟现实、人工智能和数字孪生等领域的崛起&#xff0c;每一步都勾画出了一个崭新的数字未来&#xff0c;…

实战SpringMVC之CRUD

目录 一、前期准备 1.1 编写页面跳转控制类 二、实现CRUD 2.1 相关依赖 2.2 配置文件 2.3 逆向生成 2.4 后台代码完善 2.4.1 编写切面类 2.4.2 编写工具类 2.4.3 编写biz层 2.4.4 配置mapper.xml 2.4.5 编写相应接口类&#xff08;MusicMapper&#xff09; 2.4.6 处…

高效成绩查询系统助力,让学校管理事半功倍

各位老师们&#xff0c;大家好&#xff01;作为教育工作者&#xff0c;我们都了解成绩查询在学校管理中的重要性。然而&#xff0c;传统的查询方式往往繁琐耗时&#xff0c;给我们带来了不少困扰。因此&#xff0c;今天我将向大家介绍一个极其便捷的查询工具&#xff0c;能够帮…

生成式人工智能在高等教育 IT 中的作用

作者&#xff1a;Jared Pane 通过将你大学的数据与公共 LLMs 和 Elasticsearch 安全集成来找到你需要的答案。 根据 2023 年 4 月 EDUCAUSE 的一项调查&#xff0c;83% 的受访者表示&#xff0c;生成式人工智能将在未来三到五年内深刻改变高等教育。 学术界很快就询问和想象生…

盘点:人工智能发展趋势下的4大常见AI算法以及应用场景

近年来&#xff0c;人工智能的发展速度十分惊人&#xff0c;在安防监控、工业制造、农业、教育、金融、医疗等领域中的应用越来越广泛&#xff0c;并且未来几年也将继续保持高速的发展趋势。通过人工智能技术提高自动化程度、减少人工干预、提高监管效率&#xff0c;已经成为当…

虚拟机Ubuntu操作系统常用终端命令(2)(详细解释+详细演示)

本篇概要 本篇讲述了Ubuntu操作系统常用的几个功能&#xff0c;即超级用户&#xff0c;虚拟机系统损坏如何修复&#xff0c;用户和组&#xff0c;如何以root登录界面以及文件的权限方面的知识。希望能够得到大家的支持。 文章目录 本篇概要1.超级用户1.1使用超级用户1.2切换到…

【Robotframework+python】实现http接口自动化测试

前言 下周即将展开一个http接口测试的需求&#xff0c;刚刚完成的java类接口测试工作中&#xff0c;由于之前犯懒&#xff0c;没有提前搭建好自动化回归测试框架&#xff0c;以至于后期rd每修改一个bug&#xff0c;经常导致之前没有问题的case又产生了bug&#xff0c;所以需要…

Feign远程接口调用

概述 目的&#xff1a;解决微服务调用问题。如何从微服务A调用微服务B提供的接口。 特性&#xff1a; 声明式语法&#xff0c;简化接口调用代码开发。像调用本地方法一样调用其他微服务中的接口。集成了Eureka服务发现&#xff0c;可以从注册中心中发现微服务。集成了Spring…

一文详解TCP三次握手四次挥手

文章目录 TCP的三次握手和四次挥手三次握手四次挥手 TCP的三次握手和四次挥手 基本概念 SYN&#xff08;Synchronize Sequence Numbers&#xff0c;同步序列数字&#xff09;&#xff1a;用于建立连接的同步信号。 SYN 序列号的作用是用于标识每个数据包中的字节流的起始位置。…

Java基础入门·File类的使用

前言 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ File类的创建方法 File类介绍 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ …

docker 数据持久化

文章目录 定制镜像持久化需求实现 数据卷持久化数据卷简介数据卷的特性创建读写数据卷停止容器后的操作查看数据卷详情 创建只写数据卷查看数据卷详情 创建共享数据卷 Dockerfile持久化创建Dockerfile、构建和运行镜像查看宿主机端的目录 在容器层的 UnionFS&#xff08;联合文…

笔记1.2 计算机网络结构

网络边缘 主机、网络应用 接入网络&#xff0c;物理介质 有线或无线通信链路 网络核心&#xff08;核心网络&#xff09;&#xff1a; 互联的路由器&#xff08;或分组转发设备&#xff09; 网络之网络 一、网络边缘 主机&#xff08;端系统&#xff09;&#xff1a; 位…

vue3+ts+uniapp小程序封装获取授权hook函数

vue3tsuniapp小程序封装获取授权hook函数 小程序授权的时候&#xff0c;如果点击拒绝授权&#xff0c;然后就再也不会出现授权了&#xff0c;除非用户手动去右上角…设置打开 通过uni官方api自己封装一个全局的提示: uni.getSetting :http://uniapp.dcloud.io/api/other/settin…

Java操作Influxdb2.x

本片文章不讲怎么安装&#xff0c;只讲安装后如何用JAVA代码操作库表 1.创建数据库2.为bucket添加TELEGRAF配置3.TELEGRAF配置参数说明4.配置数据库的访问权限API TOKENS5.JAVA代码操作库表5.1 yaml5.2 pom依赖5.3 config5.4 controller5.5 查询方法、结果集提取方法 1.创建数据…

SpringBoot-插件化以及springboot扩展接口

插件化常用的实现思路 spi机制&#xff0c;Service Provider Interface &#xff0c;是JDK内置的一种服务发现机制&#xff0c;SPI是一种动态替换扩展机制约定配置和目录&#xff0c;利用反射配合实现springboot中的Factories机制Java agent&#xff08;探针&#xff09;技术S…