-
遵循Haskell风格指南https://github.com/andreasabel/haskell-style-guide/blob/master/haskell-style.md.
-
熟悉我们的本地工具箱src/full/Agda/实用程序/*
.
-
编写代码时要考虑验证,记录不变量和前置和后置条件。可测不变量和代数性质转到位于的内部测试套件测试/内部
.
-
文档(in黑线鳕
样式)功能和数据结构的目的,具体到单个构造函数和字段。组件或算法的概述应在黑线鳕
模块注释。
-
记住在中记录您的新功能文档/用户手册
并在中简要介绍CHANGELOG.md公司
。请参阅测试和文件.
不包括在github上有里程碑和没有里程碑的简单错误修复标签不在中国
。这些是由发布时添加的通过工具发布管理器src/release-tools/closed-issues-for-milestone版本
.请参见结束问题.
-
在推送补丁之前运行完整的测试套件!
推荐的方法是通过我们的CI(持续集成套件)运行测试套件。提交拉取请求时自动启动。
注:本文件中的一些说明可能已过时,所以一切都要加点盐。欢迎修复过时的说明!
自:2013年6月15日。
由于Agda的存储库使用子模块,您应该克隆存储库,通过运行:
git克隆——递归子模块git@github.com:agda/agda.git
在修复bug和添加功能。只要可能,分支应基于主人
分支。当特征准备好时,应该合并特征分支,之前没有,否则我们可能会发布一个半途而废的特性。
例如,修复问题1234的工作方式如下。假设您正在使用上游
作为您的上游Agda存储库。这可能是其中之一起源
(如果你有推的权利)或你自己的阿格达叉子。
git交换机主机git交换机-c issue1234基于master创建新分支…正在处理1234号问题。。。git提交-p#记录一些补丁…在1234号问题上工作了很长时间。。。git rebase master#获取新的上游补丁,保持自己的工作在最上面git提交-p#记录更多补丁make type-check确保编译make quicker-install-bin#安装非优化agda-更快,用于测试make install-bin test#确保编译和测试(可选)#完成!git push-u上游问题1234#打开拉请求并等待CI成功。#例如,转到https://github.com/agda/agda并单击“New pull request”(新建拉请求)按钮#在分支下拉列表旁边。#获取其他开发人员的反馈。#接受的拉取请求可以合并到主请求中,如下所示:#*如果中间的一些提交没有意义或没有传递CI,则“挤压并合并”。#*如果每次提交都是有意义的,并且能够编译并在理想情况下通过所有测试,则为“Rebase and merge”。#不鼓励创建合并提交,但在例外情况下可能更可取。。
如果您想找到引入回归的提交导致应接受的模块被拒绝,然后您可以尝试以下配方:
git克隆<agda储存库>agda错误光盘agda-插头git交换机<合适的分支>cabal沙盒初始化git平分开始<错误的提交> <良好的承诺>内容提供商<一些路径>/应接受的模块agda.git平分运行sh-c\"电缆安装--强制重新安装\
--防止残疾的\
--disable-documentation退出125;\
.cabal-sandbox/bin/agda—界面中的忽略\
应接受的模块agda"
另一种方法是使用程序agda-bisectsrc/agda-切片
:
git克隆<agda储存库>agda-插头光盘agda-插头内容提供商<一些路径>/应接受的模块agda.agda-切片--不良<错误的提交>--很好<良好的承诺>\应接受的模块agda
请参见agda-bisect--帮助
了解用法信息。
以下命令暂时为启用Bash完成agda-切片
:
来源 <(agda-bisect--bash-completion-script`哪个agda切片`)
通过存储在适当目录中的文件中输出上述命令(如/etc/bash_completion.d/
).
-
测试套件的很大一部分涉及标准库。每个版本的Agda都被视为与相应版本的标准库。
-
主Agda存储库中的每个提交都有一个对分支的引用和一个在标准库存储库中提交。测试使用此标准库的引用版本。
-
要获取标准库的引用版本,请运行制作std-lib
.
-
获取并安装标准的参考版本库,运行制作最新的std-lib
.
-
获取并安装最新版本的标准库引用的分支,运行制作快速转发的std-lib
.
如果标准库的新版本也通过了所有测试,您可以让存储库指向它:
-
标准库作为git子模块进行跟踪,这意味着/标准液
子目录将显示为detached-HEAD中的git存储库状态。
为了避免这种情况,您可以在子模块目录中运行git交换机<分支名称>
然后,从根目录git子模块更新--远程[--merge|--rebase]
.
请参见:https://www.git-scm.com/book/en/v2/git-Tools-子模块
-
当您实现一个新功能时,需要将其记录在文档/用户手册/
和CHANGELOG.md公司
.
-
在这两种情况下,您都需要在下面添加回归测试测试/成功
和测试/失败
,也许还有测试/交互
.
- 在下添加测试用例时
测试/失败
,记住记录错误消息(.err错误
文件)。
- 与相同
.警告
中的文件测试/成功
和.输出
中的文件测试/交互
.
- 您还可以添加
.标志
文件来设置Agda选项。
- 您还可以添加
.vars(变量)
文件来设置环境变量(它可能引用其他环境变量,甚至那些出现在它们之前的文件中的环境变量)。
-
运行测试套件,使用进行测试
.也许你想先用制作
或制造安装销
.
-
要保留本地Makefile选项,请创建一个名为mk/配置.mk
.此路径是.git已忽略
如果存在,将加载。放置自定义覆盖那里。
-
测试并行化可以通过并行测试
生成文件变量。如果未设置,则默认为可用的CPU数量。此变量可以按运行方式进行自定义:
要使其保持为持久的默认值,请将其添加到mk/配置.mk
:
-
ghc的RTS选项可以通过GHC_RTS_临时
变量,在命令行上
或在中mk/配置.mk
.
-
您可以通过进入测试/交互
目录并键入make<测试名称>.cmp
.
-
使用Haskell/tease测试运行程序进行测试的其他选项可以使用AGDA_测试_选项
。默认情况下,交互式模式(-我
)和要运行的并行测试数(-j个
)设置为CPU内核数。
您可以使用-第页
pattern选项。例如,要只运行简单的MAlonzo编译器测试,您需要可以使用以下命令:
生成AGDA_TESTS_OPTIONS="-i-j8-p MAlonzo.simple(简单)"编译器测试
您可以使用AGDA_ARGS公司
要传递附加值的环境变量执行成功/失败/编译器测试时Agda的参数。
-
根据测试/失败
如果错误消息发生更改,则可能会失败。系统将询问您是否接受新的错误消息。或者,您可以触摸相应的源文件,因为,当测试用例发生更改时,假设错误消息也会发生变化。
-
根据测试/成功
还将测试预期的警告如果有相应的.警告
文件。如果你想记录新警告,触摸.警告
文件,运行使成功
和接受新的黄金价值。
-
确保不要引入性能回归。如果你
最后是一个带有基准的小桌子。(由于垃圾收集,这些基准并非100%稳定。)比较一下这个在新特性/错误修复之前使用基准测试。
-
您可以使用-v配置文件:7
.这很有效同样在Emacs模式下,输出会发送到*Agda调试*
缓冲区。请注意-v配置文件:7
选项是不应该是的在OPTIONS杂注中给定,请使用agda2-程序参数
.
-
如果使用GHC 9.2或更高版本并使用GHC选项进行编译-查找表映射
和-fdistict-constructor表
,然后你可以获得将堆闭包绑定到源代码位置的堆配置文件,甚至如果程序不是使用编译的-教授
然而,使用这些标志可以使Agda二进制文件变得更大,所以它们不是默认情况下激活。
以下步骤可能有效(首先安装事件日志2html
使用,例如,类似于电缆安装事件日志2html
):
使CABAL_OPTS=--ghc-options="-finfo-table-map-f区分构造表"安装agda版本…+RTS-l-au-hi-i0.5事件日志2html agda-VERSION.eventlog
在这里版本
是Agda的版本号。查看结果文件agda-VERSION.eventlog.html
并选中名为“Detailed”的选项卡。
-
单向要获得时间配置文件,需要在编译时启用配置文件,使用GHC选项-fprof平板
(从GHC 9.4.1开始提供),并使用运行时选项+RTS-p-l-au
。然后应获得.eventlog(事件日志)
可以转换为.eventlog.json文件
文件使用高速测速仪.然后可以将该文件加载到速度范围.app.
以下步骤可能有效(首先安装高速测速仪
使用,例如,类似于电缆安装高速示波器
):
阴谋集团建造\--禁用文档\-推测可重防御集群计数\--enable-profileing--program-suffix=-prof\--配置文件详细信息=none--ghc选项=-fprof late\--ghc选项="+RTS-A128M-M4G-RTS"Agda_datadir=src/data/dist新闻样式/build/*/温室气体-*/阿格达-*/构建/agda/agda…+RTS-p-l-au高速示波器agda.eventlog
加载结果文件agda.eventlog.json公司
进入之内速度范围.app.
-
为了避免空白测试失败的问题,我们建议添加跟随行到.git/hooks/预提交
:
回声 "开始预提交"生成检查空白如果[$? -无0 ]; 然后
出口1fi(菲涅耳)
回声 "结束预提交"
您可以修复运行中的空白问题
-
要在本地构建用户手册,您需要安装以下依赖项:
要查看可用目标的列表,请执行提供帮助
在文档/用户手册中。例如,呼叫生成html
构建html格式的文档。
-
使用Cabal沙盒运行测试套件
如果沙盒使用例如目录dist/dist-sandbox-12345
您可以使用以下命令:
出口AGDA_BIN=dist/dist-sandbox-12345/build/AGDA/AGDA出口AGDA_TESTS_BIN=dist/dist-sandbox-12345/build/AGDA-TESTS/AGDA-TESTS制作测试
-
内部测试套件
内部测试套件测试/内部
用于测试Agda库(在关闭第2083期后,不会使用QuickCheck库)。
测试套件使用与Agda库相同的目录结构。
模块的内部测试阿格达。富。酒吧
应位于模块中内部。富。酒吧
。与相同任意
和共同仲裁
实例。
可以在GHCi中加载内部测试套件模块。这里有一个可以做什么的示例:
cabal repl测试-O0-repl-no-load[…]全球温室气体排放指数>:l内部。类型检查。替代[…]全球温室气体排放指数>快速检查项目(_W)+++好的,通过了100次测试。全球温室气体排放指数>测试。Tasty.defaultMain测试[…]***例外:退出成功
建议您编译,而不是在本地运行所有测试套件Agda和在自己的GitHub分叉上通过GitHubActions运行测试套件当黑客攻击Agda时。
测试了不同的工具链、编译标志和平台。这些测试尽可能并行执行以提高效率,因此理想情况下还可以节省你有空。
您应该在GitHub操作页面中看到状态。
也可以使用特殊的(头部)提交消息中的短语。短语可能出现在提交消息。下面列出了可接受的短语。
GitHub工作流将检查head commit中的短语(仅)推送(即,如果您一次推送3次提交,则只推送最近的检查commit消息中的短语)。
短语 |
效果 |
[ci跳过] |
跳过Travis作业和GitHub工作流 |
[跳过ci] |
As-per公司[ci跳过] |
-
如果您使用的是最新的haskell-mode(使用M-x包-安装haskell-模式
当然,Debian打包的内容是不够的),您正在编辑Haskell文件,可以通过点击将其加载C-C C-l公司
,并同意Emacs关于路径和其他问题的建议。
-
您可以从切换:加载
到:重新加载
具有C-u C-C C-l
,其中你可能会想要,否则你会让每个人都有负担时间。
-
你有语义跳跃M-。
.别再惹人讨厌的T.A.G.S.了。!
-
您可以使用跳转到错误和警告C-x公司
。你可能会这样做还有很多其他的东西,Emacs是你的牡蛎。
-
有一点需要注意:GHCi需要一些生成的文件才能工作你肯定有,你可以发布阴谋集团建造
并在它出现时杀死它开始编译模块。似乎没有程序指示阴谋集团这样做的方法。他们非常稳定,所以你不会必须经常这样做。
-
如果修复了与语法突出显示相关的错误,请添加测试案例低于测试/交互
.示例.英寸
file命令:
IOTCM“Foo.agda”非交互式直接(Cmd_load“Foo/agda”[])
如果要包含交互式高亮显示指令,请替换非交互式
具有交互式
.
-
Nils Anders Danielsson的以下Elisp代码修复了空白保存时出现问题。添加到您的.emacs(电子邮件)
.
(defvar(定义变量) 固定白色空间模式'(文本模式agda2-mode haskell-mode emacs-lisp-mode LaTeX-mode TeX模式)"*当使用这些模式时,应该修复空白空间问题。")(添加hook 'before-save-hook(λ 零(什么时候(和(成员主模式固定白色空间模式)(不缓冲区只读));; 删除尾部空白。(删除拖尾空白);; 如有必要,插入最后一个换行符。(储蓄支出(存储限制(拓宽)(除非(平等的 ?\n个(焦炭前(点-最大值)))(goto字符(点-最大值))(插入 "\n个")))))))
自:2021年11月。
- 当你跑步时
进行安装
,那么选项优化的重点是默认激活。如果您想覆盖此选项(为了更快构建时间,代价可能是降低Agda的速度),然后您可以在中包含以下文本mk/配置.mk
,被忽略Git公司:CABAL_FLAG_OPTIM_HEAVY电缆=STACK_FLAG_OPTIM_HEAVY堆叠=
自:2020年4月。
制作排字
只需对Agda源代码进行类型检查,不会生成任何代码。速度可以快7倍使快速安装成为可能
(最长40秒,最长5分钟)。修复所有类型错误后,切换到快速安装销
或安装垃圾箱
用于测试。
自:2019年7月。
-
更快地安装垃圾箱
编译Agda将关闭所有优化(-0号机组
).例如,这可能是5倍的速度(5分钟而不是25分钟)。
-
建议在重构、新功能或错误修复的开发过程中使用。不建议在为Agda开发构建Agda时使用。未优化的Agda速度慢。
-
生成的可执行文件具有后缀-更快
例如。,agda-更快
.
-
在Emacs中,通过激活此版本的AgdaM-x agda2-set-program-version RET更快RET
.
-
运行测试套件需要一些修改。例如,交互式测试套件可以通过运行make-C测试/交互AGDA_BIN=AGDA-更快
.
在撰写本文时,Agda的整个开发堆栈仍以工具,如卡瓦尔
和生成文件
.
开发Agda堆栈
,复制您的stack-x.y.z.yaml文件之一选项,并将其重命名为堆垛山药
例如:
你可以走了!
您可以继续构建项目并像您一样运行测试之前:
要运行Ghci公司
:
这个按里程碑列出的已解决问题
程序需要GitHub个人中的访问令牌github令牌
环境变量,即,
export GITHUBTOKEN=您的个人访问权限
个人访问令牌可以从GitHub用户生成:
在发布例如Agda 1.2.3之前,我们将CHANGELOG公司
全部的里程碑1.2.3中的已解决问题,但这些问题除外使用中列出的标签进行标记标签NotInChangelog
在中src/release-tools/closed-issues-for-milestone/Main.hs
文件。
请参见http://agda.readthedocs.io/en/latest/contribute/documentation.html.
类型检查
- 将基本体添加到
阿格达。类型检查。Primitive.primitiveFunctions基本函数
.
- 如果原语只对文字进行操作,请将原语添加到
阿格达。类型检查。减少。快速
也。(检查阿格达。语法。混凝土。字面意义的
来找出答案。)
- 如果原语操作反射语法,请将原语添加到
阿格达。类型检查。取消报价TCM
也。
内置模块
- 将原语添加到相关
阿格达。内置
模块,在原始的
块。
Haskell后端
- 将基本体添加到
阿格达。编译器。马隆佐。基本体.primBody
.确保将任何相关导入添加到导入ForPrim
、和至将任何相关功能添加到马隆佐。RTE公司
.
JavaScript后端
- 将基本体添加到
阿格达。编译器。JS公司。编译器.原语
.
- 提供原语的实现:
- 如果您的实现只使用vanilla中可用的类型JavaScript,您可以将实现放在
src/data/JS/agda-rts.JS
;
- 如果您的实现需要在
阿格达。内置
模块,必须将实现放在{-#编译JS…#-}
杂注,在相关内置模块(参见,例如。,阿格达。内置。字符串.primStringUncs
.
家务
- 描述您在中的更改
CHANGELOG.md公司
.
- 在中描述您的新原语
文档/用户手册
.