在CI中运行Emacs byte compiler检查emacs配置代码

全文见, http://blog.binchen.org/posts/use-ci-to-improve-the-quality-of-emacs-distribution/

任何人都可以用这个方案来改善配置的代码质量。这个方案是跑编译器,不是跑unit test.

方案简化后也可以用与package开发。

7 个赞

牛。。。。。。

來順便推行一下我認為比較好的CI模式.

我最近開發了 Eask, 和 Cask 是個同類型的東西. 但修補了幾項重大缺失, 主要能支援Windows.

一般情況做CI:

lint: deps
	@$(EMACS) $(EMACS_BATCH_OPTS) -l tests/my-elint.el 2>&1 | grep -E "([Ee]rror|[Ww]arning):" && exit 1 || exit 0

compile: deps
	$(RM) *.elc
	@$(EMACS) $(EMACS_BATCH_OPTS) -l tests/my-byte-compile.el 2>&1 | grep -E "([Ee]rror|[Ww]arning):" && exit 1 || exit 0

test: compile deps
	@$(EMACS) $(EMACS_BATCH_OPTS) -l tests/evil-matchit-tests.el
...

用 Eask 比較簡短,

lint:
	@echo "Run package-lint..."
	$(EASK) lint package

compile:
	$(EASK) compile  # 檔案(.el)從 Eask-file 獲取

test:
	$(EASK) install-deps --dev  # 包(dep)從 Eask-file 獲取
	$(EASK) exec ert-runner -L .

至於哪些檔案會被 compile 或 哪些依賴會被下載. 全部都交給Eask-file. 下面為範例.

範例原檔: dap-mode/Eask at master · emacs-lsp/dap-mode · GitHub

...

(package-file "dap-mode.el")  ; 這預設會被compile

(files "*.el")  ; 其他 .el 也一起被編譯, 使用wildcards

(source "gnu")
(source "melpa")

(depends-on "emacs" "26.1")

;; 以下包會被下載, 連同一起被編譯和測試 (sandbox)
(depends-on "lsp-java")
(depends-on "markdown-mode")
(depends-on "tree-mode")
(depends-on "bui")

這樣感覺會清楚很多. 另外我會推薦測試打包安裝.

build:
	$(EASK) package  # 測試打包, 執行前會下載package-build. 這樣最安全也直接
	$(EASK) install  # 測試安裝, 安裝打包後的檔案 (.el/.tar)

Eask 還提供了很多種的測試, elsa, checkdoc, indent-lint, 等等.

記得測試要做全, 如果只在 ubuntu-test 下做測試很容易遺漏其他平台上的bug.

...
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        emacs-version: [26.1, 26.2, 26.3, 27.1, 27.2, 28.1, snapshot]
    steps:
      - uses: actions/[email protected]
      # purcell 的不支援 windows
      - uses: jcs090218/[email protected]
        with:
          version: ${{ matrix.emacs-version }}

例如我幫 jojojames/fussy 做了CI, 馬上就在 macOS 和 Windows 平台上面找到bug. (他原先只有測試 Ubuntu)

PR連結: https://github.com/jojojames/fussy/pull/7

希望有幫助! :slight_smile:

5 个赞

@jcs090218 同学,你现在接手 popup-el 的维护工作了吗?

@tumashu 現階段是阿! 但目前人手不夠, 我也還有自己的項目. 主頁應該還在找共同維護者. 有興趣可以直接ping @tarsius. 我現在只有review PR 和一些基礎回復而已. :sweat_smile:

有无支持 ecukes 的计划?

剛看了下ecukes, 你可以直接使用 eask exec ecukes [...].

Cask 有的 Eask 應該都有才對! 希望有回復你的問題! :smiley: