@arkstack/scheduler

中文文档
0.22.2发布于 2026/11/07ES Module近 30 天下载 2328

Task scheduling for Arkstack: fluent frequencies, cron, overlap/one-server locks, hooks, and schedule:run/work/list commands.

原始使用文档
文档目录9 节
  1. Install
  2. Define your schedule
  3. Run it
  4. Frequencies
  5. Constraints
  6. Overlaps, single-server & background
  7. Hooks
  8. API
  9. License

@arkstack/scheduler

@arkstack/scheduler

Task scheduling for Arkstack. Define scheduled tasks fluently in code instead of managing a crowd of cron entries — a single system cron entry drives everything.

Install

pnpm add @arkstack/scheduler
ark publish --package @arkstack/scheduler   # writes src/routes/console.ts

Full app templates include it and a src/routes/console.ts already.

Define your schedule

In src/routes/console.ts:

import { Schedule } from '@arkstack/scheduler'

Schedule.command('cache:prune').hourly()

Schedule.call(async () => {
  await pruneTempFiles()
})
  .dailyAt('01:30')
  .withoutOverlapping()

Schedule.job(new SendDigest()).weeklyOn(1, '08:00')

Schedule.exec('backup.sh').daily().onOneServer()
Task typeRuns
Schedule.command(name, args?)An Arkstack CLI command (ark <name>)
Schedule.call(fn)A callback
Schedule.job(job)A queued job (dispatched via @arkstack/jobs)
Schedule.exec(cmd, args?)A shell command

Run it

The scheduler evaluates due tasks once a minute. In production, add one cron entry:

* * * * * cd /path/to/app && npx ark schedule:run >> /dev/null 2>&1

During development, run the foreground worker instead:

ark schedule:work    # evaluates the schedule every minute until stopped
ark schedule:list    # list tasks with their next run time

Frequencies

Schedule.command('x').everyMinute()
Schedule.command('x').everyFiveMinutes() // */5 * * * *
Schedule.command('x').everyThirtyMinutes()
Schedule.command('x').hourly()
Schedule.command('x').hourlyAt(15)
Schedule.command('x').daily()
Schedule.command('x').dailyAt('13:00')
Schedule.command('x').twiceDaily(1, 13)
Schedule.command('x').weekly()
Schedule.command('x').weeklyOn(1, '8:00') // Monday 08:00
Schedule.command('x').monthly()
Schedule.command('x').monthlyOn(15, '17:00')
Schedule.command('x').quarterly()
Schedule.command('x').yearly()
Schedule.command('x').cron('*/10 9-17 * * 1-5') // raw cron

Day-of-week constraints, with time layered on top:

Schedule.command('x').weekdays().at('9:00')
Schedule.command('x').weekends().hourly()
Schedule.command('x').mondays()
Schedule.command('x').days([1, 4]) // Monday & Thursday

Set the timezone the expression is evaluated in:

Schedule.command('x').dailyAt('09:00').timezone('America/New_York')

Constraints

Schedule.command('x')
  .daily()
  .when(async () => await featureEnabled('reports')) // run only when truthy
  .skip(() => isHoliday()) // skip when truthy
  .environments('production', 'staging') // limit by APP_ENV
  .between('09:00', '17:00') // only within a daily window

unlessBetween('22:00', '06:00') runs outside a window (overnight ranges handled).

Overlaps, single-server & background

Schedule.command('report:build').everyFiveMinutes().withoutOverlapping()
Schedule.exec('backup.sh').daily().onOneServer()
Schedule.exec('long-import.sh').daily().runInBackground()

withoutOverlapping() and onOneServer() coordinate through @arkstack/cache, so they work across processes and servers. Configure a shared cache store (redis or database) for onOneServer() to be effective; without a cache the scheduler falls back to a process-local lock.

Hooks

Schedule.command('report:build')
  .daily()
  .before(() => logger.info('building report'))
  .onSuccess(() => notifyOk())
  .onFailure((error) => notifyFailed(error))
  .after(() => logger.info('done'))

API

  • Schedule.command / call / job / exec — register a task, returns a ScheduledEvent for chaining.
  • Schedule.events() / Schedule.dueEvents(date?) — inspect registered / due events.
  • ScheduledEvent — the fluent builder (frequencies, day constraints, timezone, when, skip, environments, between, unlessBetween, withoutOverlapping, onOneServer, runInBackground, before/after/onSuccess/onFailure, description, name).
  • Commands: schedule:run, schedule:work, schedule:list.

Cron evaluation is powered by croner. See the scheduling guide for the full walkthrough.

License

MIT

版本与发布记录

@arkstack/scheduler 共发布 55 个版本,首次发布于 2026/07/09;过去 12 个月发布了 55 个版本。

版本发布日期距今
0.22.2latest2026/11/07今天
0.22.12026/11/052 天前
0.22.02026/11/052 天前
0.21.12026/11/052 天前
0.21.02026/10/2810 天前
0.20.22026/10/2315 天前

关于 @arkstack/scheduler 的常见问题

@arkstack/scheduler 是什么?

Task scheduling for Arkstack: fluent frequencies, cron, overlap/one-server locks, hooks, and schedule:run/work/list commands.

如何安装 @arkstack/scheduler?

在项目目录运行 npm install @arkstack/scheduler,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@h3ravel/musket(^2.2.13)、@arkstack/contract(^0.22.2)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@arkstack/scheduler 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/arkstack__scheduler 是否存在。

@arkstack/scheduler 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@arkstack/scheduler 可以商用吗?

@arkstack/scheduler 使用 未声明 许可。package.json 没有声明许可证。没有许可证的代码默认保留全部权利,商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括,不构成法律意见,请以许可原文为准。

@arkstack/scheduler 的下载量有多少?

根据 npm 官方下载统计,@arkstack/scheduler 在 2026/10/07 – 2026/11/05 这 30 天内被下载 2,328 次,日均约 78 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@arkstack/scheduler 还在维护吗?

最新版本 0.22.2 发布于 2026/11/07(今天);至今共发布 55 个版本,其中过去 12 个月发布了 55 个;首次发布于 2026/07/09。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。