Racket 包开发实战:手把手教你发布符合官方标准的 Racket 包

#Innolight #Lisp #Racket

发布 Racket 包并不复杂,但第一次发布时,很多人会卡在两个极端:

本文的目标只有一个:

让你第一次发布的 Racket 包,符合官方生态的基本预期,并成功进入官方包目录。

一、什么是“合格的官方包”?

一个可以发布到 pkgs.racket-lang.org 的包,至少需要:

后文的所有步骤,都是围绕这些最低要求展开的。

二、创建包的基本结构

my-first-pkg/
├── main.rkt
├── info.rkt
├── my-first-pkg.scrbl
├── README.md
├── LICENSE
└── tests/
    └── test-main.rkt

这是 Racket 官方生态中最常见、最稳妥的结构,新手不建议自行变形。

三、实现一个真实可发布的模块

#lang racket/base

(provide add1-safe
         (contract-out
          [even? (-> exact-integer? boolean?)]))

(define (add1-safe x)
  (+ x 1))

这个示例刻意保持简单,但具备官方包的基本特征:

四、编写 info.rkt(发布的关键)

#lang info

(define collection "my-first-pkg")
(define pkg-desc "My first Racket package")
(define version "0.1.0")
(define pkg-authors '("Your Name"))

(define deps '("base"))
(define build-deps '("scribble-lib" "racket-doc" "rackunit-lib"))

(define scribblings '(("my-first-pkg.scrbl" ())))

(define license 'MIT)

info.rkt 决定了包能否被官方目录正确识别,没有它就无法发布。

五、准备最小但合格的文档

官方包可以很简单,但不能没有文档

#lang scribble/manual

@require[@for-label[my-first-pkg racket/base]]

@title{My First Package}
@author{Your Name}

@defmodule[my-first-pkg]

@section{API}

@defproc[(add1-safe [x integer?]) integer?]{
Adds 1 to @racket[x].
}

要求只有三点:

六、添加基础测试(用于构建验证)

#lang racket/base

(require rackunit
         my-first-pkg)

(check-equal? (add1-safe 1) 2)
(check-true (even? 2))

测试的目的不是覆盖率,而是确保包在官方构建环境中不会失败。

raco test .

七、README 与 LICENSE

README 至少应包含安装方式:

raco pkg install my-first-pkg

LICENSE 建议选择常见协议(MIT / BSD / Apache-2.0)。

八、发布到官方包目录

  1. 将代码推送到 Git 仓库
  2. 打开 https://pkgs.racket-lang.org/
  3. 选择 Add Your Own Package
  4. 填写包名与仓库地址并提交

系统会自动执行构建、测试和文档生成。

发布成功后,你的包即可通过:

raco pkg install my-first-pkg

进行安装。

九、关于版本与维护(了解即可)

这些属于下一阶段内容,不影响第一次发布。

十、总结

第一次发布 Racket 包,不需要做到“完美工程”,但必须做到:

做到这些,你发布的就不是玩具包,而是一个正式进入 Racket 生态的官方包