跳到内容

最新提交

 

历史

历史
619行(475个位置)·22.2 KB

哈金.md

文件元数据和控件

619行(475个位置)·22.2 KB

行为准则

  • 遵循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(持续集成套件)运行测试套件。提交拉取请求时自动启动。

注:本文件中的一些说明可能已过时,所以一切都要加点盐。欢迎修复过时的说明!

使用Git

自: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存储库中的每个提交都有一个对分支的引用和一个在标准库存储库中提交。测试使用此标准库的引用版本。

    • 文件/.git模块包含标准库的URL存储库和分支的名称。

    • 这条路/标准液被git视为包含引用的提交。

  • 要获取标准库的引用版本,请运行制作std-lib.

  • 获取并安装标准的参考版本库,运行制作最新的std-lib.

  • 获取并安装最新版本的标准库引用的分支,运行制作快速转发的std-lib.

    如果标准库的新版本也通过了所有测试,您可以让存储库指向它:

    git添加std-libgit提交
  • 标准库作为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数量。此变量可以按运行方式进行自定义:

    使PARALLEL_TESTS=4测试

    要使其保持为持久的默认值,请将其添加到mk/配置.mk:

      并行测试= 4
  • ghc的RTS选项可以通过GHC_RTS_临时变量,在命令行上

    使GHC_RTS_OPTS=-M8G安装

    或在中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(菲涅耳)
        回声 "结束预提交"

    您可以修复运行中的空白问题

    使固定白色面
  • 要在本地构建用户手册,您需要安装以下依赖项:

    • Python>=3.4.6。

    • 斯芬克斯和斯芬克斯rtd主题

      pip3安装--用户-r文档/user-manual/requirements.txt

      请注意--用户选项将Sphinx二进制文件放入$HOME/.local/bin.

    • 乳胶

    要查看可用目标的列表,请执行提供帮助在文档/用户手册中。例如,呼叫生成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测试[…]***例外:退出成功

使用GitHub操作进行测试

建议您编译,而不是在本地运行所有测试套件Agda和在自己的GitHub分叉上通过GitHubActions运行测试套件当黑客攻击Agda时。

测试了不同的工具链、编译标志和平台。这些测试尽可能并行执行以提高效率,因此理想情况下还可以节省你有空。

您应该在GitHub操作页面中看到状态。

跳过工作流/在制品(WIP)提交

也可以使用特殊的(头部)提交消息中的短语。短语可能出现在提交消息。下面列出了可接受的短语。

GitHub工作流将检查head commit中的短语(仅)推送(即,如果您一次推送3次提交,则只推送最近的检查commit消息中的短语)。

短语 效果
[ci跳过] 跳过Travis作业和GitHub工作流
[跳过ci] As-per公司[ci跳过]

一些Agda黑客知识

  • 无论何时更改接口文件格式,都应更新阿格达。类型检查。序列化当前接口版本.

  • 每当你改变阿格达·斯蒂,更新中的日期\Provides包.

  • 使用__不可能__而不是调用错误。__不可能__生成以下形式的错误:

    出现内部错误。请将此报告为错误。错误位置:。。。

    调用错误会使Agda失败,并在*全球温室气体排放指数*缓冲区。

  • 全球范围内启用GHC警告阿格达·卡巴尔。如果你想打开或关闭特定文件中的单个警告,使用选项_GHC杂注。不要使用-墙壁,因为这意味着不同版本的GHC的标志可能不同。

  • GHC文件(7.10.1)包含以下信息关于孤立实例:

    GHC识别孤立模块,并访问正在编译的模块下面的每个孤立模块。这通常是浪费了工作,但无法避免。因此你应该这样做您最好尽可能少地使用孤立模块。

    请参见:https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/seleparate-compilation.html#孤儿模块.

    为了避免不必要的孤立实例标志-fwarn-孤儿已打开。如果您真的想使用孤立的实例、场所

    {-#选项_GHC-fno-warn-孤儿#-}

    位于包含实例的模块的顶部。

Haskell-mode和Agda代码库

  • 如果您使用的是最新的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需要一些生成的文件才能工作你肯定有,你可以发布阴谋集团建造并在它出现时杀死它开始编译模块。似乎没有程序指示阴谋集团这样做的方法。他们非常稳定,所以你不会必须经常这样做。

Emacs模式

  • 如果修复了与语法突出显示相关的错误,请添加测试案例低于测试/交互.示例.英寸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个")))))))

更快地编译Agda

自: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文件之一选项,并将其重命名为堆垛山药例如:

cp堆8.4.4.yaml堆yaml

你可以走了!

您可以继续构建项目并像您一样运行测试之前:

进行安装测试

要运行Ghci公司:

堆栈repl

按里程碑计划列出的已解决问题

这个按里程碑列出的已解决问题程序需要GitHub个人中的访问令牌github令牌环境变量,即,

export GITHUBTOKEN=您的个人访问权限

个人访问令牌可以从GitHub用户生成:

设置->开发者设置->个人访问令牌

CHANGELOG中报告的已解决问题

在发布例如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.

如何…

添加基元函数

类型检查

  1. 将基本体添加到阿格达。类型检查。Primitive.primitiveFunctions基本函数.
  2. 如果原语只对文字进行操作,请将原语添加到阿格达。类型检查。减少。快速也。(检查阿格达。语法。混凝土。字面意义的来找出答案。)
  3. 如果原语操作反射语法,请将原语添加到阿格达。类型检查。取消报价TCM也。

内置模块

  1. 将原语添加到相关阿格达。内置模块,在原始的块。

Haskell后端

  1. 将基本体添加到阿格达。编译器。马隆佐。基本体.primBody.确保将任何相关导入添加到导入ForPrim、和至将任何相关功能添加到马隆佐。RTE公司.

JavaScript后端

  1. 将基本体添加到阿格达。编译器。JS公司。编译器.原语.
  2. 提供原语的实现:
    • 如果您的实现只使用vanilla中可用的类型JavaScript,您可以将实现放在src/data/JS/agda-rts.JS;
    • 如果您的实现需要在阿格达。内置模块,必须将实现放在{-#编译JS…#-}杂注,在相关内置模块(参见,例如。,阿格达。内置。字符串.primStringUncs.

家务

  1. 描述您在中的更改CHANGELOG.md公司.
  2. 在中描述您的新原语文档/用户手册.