There is another good way to distribute your extension: your own update site. See the Distribution page for details.
将您的软件组件Fiji的部分进行分发是一种有效的方式,可以将其轻松地交付给众多用户,以及积极参与ImageJ软件开发社区。然而,这样做有一些相应的规则。
以下文档描述了这些要求以及相关的最佳实践,用于将您的组件作为Fiji更新站点的一部分进行运输。
#定义
“核心”Fiji项目是分布在Fiji update site上的项目。此类项目须满足以下讨论的要求。相反,如果您在单独的更新站点上分发扩展,则此页面不适用。
#要求
免费访问源代码
斐济项目的一个关键原则是:
如果你想走得快,就一个人走。如果你想走得远,就一起走。
- 非洲谚语
智慧有很多推论,其中最突出的是:如果您编写的软件是为了努力发现这种新的想法,Open Source是让您走得最远的方式。扣留源代码——就像任何其他被隐瞒的其他研究人员的方法一样,例如拒绝分享材料和方法——从长期来看将invariably have the opposite effect。同样,与相关的双边合作改进项目必然会带来更好、更好的结果。
因此,与斐济分发的组件必须以 compatible with the GNU General Public License 的方式获得许可。
源托管在 GitHub 上
斐济开发核心在§§8§§§上进行。这保证了连续性和可见性,并促进协作。
您托管的项目在哪里有两种可能性:
- 标准。 存储库托管在 fiji organization 或后代组织(例如,trakem2)中。 Fiji maintainers帮助维护项目。
- 外部。 存储库托管在您控制的 GitHub 组织中。您独立维护该项目(尽管斐济维护人员可能会提交 PR 来提供帮助)。
标准项目
以下标准适用于 fiji organization 中托管的项目:
- 每个组件(即JAR文件)都位于其自己的存储库中。
- 组件使用Maven来构建:
- As single-module projects
- With the standard Maven directory layout
- Extending the pom-scijava parent POM
- 组件使用groupId
sc.fiji。 - 组件为versioned according to SemVer。
- 该项目使用GitHub Issues进行问题跟踪。
- 该项目在 ImageJ wiki 上有一个专门的页面。
- Fiji maintainers可以根据需要对组件进行配置和release new versions,以便斐济作为一个整体继续按预期工作。
master分支在任何时候都被认为是“发布就绪”,这意味着它可以通过测试进行编译,并准备好供下游使用。
外部项目
位于fiji organization之外的项目不受上述要求的约束。但项目维护人员有责任确保项目在斐济的最新安装中继续正常运行。随着ImageJ和斐济的发展,这可能需要更改代码。
持续集成:GitHub Actions
为了验证斐济组件的构建是否没有问题以及所有回归测试是否通过,每个斐济项目的源代码存储库都连接到一个GitHub Actions作业,该构建作业和测试源代码,并在新版本修订可用时部署Maven artifacts。
请查看GitHub Actions页面,了解有关设置的说明。
版本控制和依赖收敛
大多数斐济项目都使用 SemVer versioning scheme:鼓励 API 一致性而不阻止 API 改进的标准。
核心斐济项目的最低要求是外表 §§0§§§ 的 MAJOR 数字部分,即,如果版本字符串的颈部数字增加,则意味着新版本“不”兼容旧版本。相反,如果版本字符串的任何后续数字增加,则意味着新版本*兼容。
这一要求的存在是为了促进依赖项收敛的自动化:在整个斐济使用兼容的依赖项版本。当斐济组件的两个(或多个)依赖于同一组件的不同版本时,必须能够验证哪个较旧版本新,以及较新版本是否兼容旧版本。只要最新工具的依赖项确实可以兼容,这些依赖项就被称为“收敛”。
例如,Apache Commons Math v3.x 破坏了与 Apache Commons Math v2.x 的一致性。由于两个版本共享相同的包和类名称,因此斐济只能提供其中一个版本。因此,Fiji 的所有组件都必须依赖于相同的主要版本:v2 或 v3。
一般来说,如果 Fiji 发行版本的其余部分升级到您的组件所依赖的库的新主要版本,您的组件也必须升级才能使用新版本。此类通常是在 discussion on public channels 之后完成的。
最佳实践:版本常量
斐济的许多插件都包含明确的版本常量。如果没有Maven,代码内常量作为跟踪兼容性的一种方式可能很有意义。但是通过 Mavenizing 对斐济的贡献,pom.xml 提供了一种标准的版本控制机制,允许从源代码中的常量迁移。
通过 pom.xml 进行版本控制有几个优点可以促进 reproducible builds,包括:
- 标准化脚本以适当增加版本。
- 没有意外重复发布给定版本的风险。
- 用户和开发者看到相同的版本信息。
另外,为了兼容,可以自动推导出版本:
- 来自POM。这是最可靠的选择。为了方便入门,scijava-common提供了一个实用的程序类来帮助版本检索:VersionUtils。 -或者,可以使用 specification 或 implementation 版本 - 例如,如LSMReader。核心斐济库遵循设置这些版本以匹配 pom 版本的规定,并且它们在清单级别设置,以确保它们对于给定组件中的所有包都是相同的。 但是,两个版本允许不同 -每个包都允许有自己的规范和实现版本!另外,默认包中的类将无法检索任何版本。因此这些功能不能作为通用解决方案。
Maven工件
Fiji和相关SciJava软件使用Maven(一种行业标准声明来有关项目的元数据),使用所述元数据构建项目,将生成的工件“部署”到Maven repository。此类存储库本质上是针对开发人员的,就像update sites针对用户一样。
- 斐济核心项目的最低要求是使用一个构建系统(例如,Maven或Gradle),该系统自动将所需的工件部署到SciJava Maven repository,以便它们可以被下游代码(包括其他济斐项目)使用。部署所需的工件包括主JAR和POM文件、
-testsJAR、-sourcesJAR和-javadocJAR。 - 为了促进这一点,大多数斐济项目从 pom-fiji 父项目继承了通用的 Maven 配置。此配置不仅确保部署已编译的 .jar 文件,还确保部署 Javadocs 和源代码。因此,强烈鼓励扩展此父级;有关详细信息,请参阅Maven component structure部分。
- 斐济的所有组件均由CI/CD部署到SciJava Maven repository或OSS Sonatype。这样,所有斐济组件都可以轻松添加为下游项目的依赖项。
- 所有斐济组件均架构在 fiji 项目的 POM 中声明为依赖项,并在 pom-fiji 父级中声明为托管项依赖,作为斐济 Bill of Materials 的一部分。
指南
以下指南技术性较差,哲学性影响,但代表了斐济核心组件的最佳实践。
开放开发流程
斐济组件的开发人员应该邀请其他人做出贡献。这需要开发人员欢迎、承认并处理拉取请求、鼓励改进、共同工作、加强普遍的工作、分享意见等。
要利用open source的力量,讨论时应使用public channels默认。换句话说,要问的问题应该是“是否有任何充分的理由说明为什么这次对话应该保密?”而不是相反。
主动错误管理
错误报告需要承认,应问题鼓励涉及解决错误,错误不需几个月无人评论(我们都有完成的时候,例如写论文;一条小消息人员可以帮助得到理解),当错误多年未解决时应进行解释,等等
可重用性和可靠性
只要有可能,就应该重用源代码。如果需要,改进现有源代码。只有在绝对需要时才从头开始重写。
使代码可重用,定义API来使用该功能。这需要一点纪律,即便于第三方可以依赖这些接口。
回归测试
编写回归测试的方法是easy:在src/test/java/目录结构中创建一个类,并用@Test注释方法,测试各种assertions(最常见的是assertEquals()、assertTrue()和assertNotNull())。
特别是在修复错误时,首先编写回归测试是一个好的主意,以确保它确实失败。之后,人们应该开发修复程序,一旦回归测试通过,会有一种舒适和温暖的感觉。
关注点分离
新功能应放入适当的组件中。例如,在添加通用实用程序时,请考虑为 SciJava Common 或 ImageJ Common 做出贡献,而不仅仅是与您的特定扩展组合在一起。
例子
下面提供了一些斐济各个组件的结构示例。
|
基础知识 |
|||||||
|
分类 |
成分 |
核?1 |
更新站点 |
执照2 |
组织 |
车库 |
组ID |
|
标准 |
✅ |
|
|||||
|
✅ |
|
||||||
|
✅ |
|
||||||
|
✅ |
? |
|
|||||
|
外部的 |
✅ |
|
|||||
|
✅ |
|
||||||
|
子项目 |
✅ |
|
|||||
|
✅ |
|
||||||
|
第三者 |
❌ |
|
|||||
|
❌ |
|
||||||
|
❌ |
|
1 A “core” project is one distributed on the Fiji update site. These projects are subject to the requirements discussed on this page.
2 See the Licensing page for further details.