商品网站做推广方案商丘云网广告有限公司
2026/1/22 5:30:21 网站建设 项目流程
商品网站做推广方案,商丘云网广告有限公司,创建公司要具备什么条件,百度竞价推广属于什么广告近日#xff0c;日本开发者 4245ryomt 在 Zenn 上发布了一系列围绕 MoonBit 与 WebAssembly 插件实践 的技术文章#xff0c;分享了他使用 MoonBit 编写 sqlc Wasm 插件 的完整尝试过程。 文章通过可运行代码#xff0c;介绍了插件请求处理、文件生成以及 Wasm 执行等关键环…近日日本开发者4245ryomt在 Zenn 上发布了一系列围绕MoonBit 与 WebAssembly 插件实践的技术文章分享了他使用 MoonBit 编写sqlc Wasm 插件的完整尝试过程。文章通过可运行代码介绍了插件请求处理、文件生成以及 Wasm 执行等关键环节展示了 MoonBit 在工具链与 Wasm 场景下的实际开发体验适合作为相关方向的实践参考。 原文链接https://zenn.dev/4245ryomt/articles/9680434dc60c0c↓以下为系列第一篇的原文翻译本文内容本文介绍了使用 MoonBit 来制作 sqlc 插件的过程。本文并不会完成一个能够在 MoonBit 中“很好地执行SQL”的库。在这个过程中会用到 在 MoonBit 中使用 protoc以及 执行由 MoonBit 构建的 wasm。写着写着发现内容比预期要长因此拆分成多篇文章。第 1 篇:将 sqlc 插件的输入用 MoonBit 进行解析。第 2 篇:将 MoonBit 输出的wasm**作为 sqlc 的插件来使用。本文中使用的moon命令版本如下$ moon versionmoon0.1.20251202(1a598002025-12-02)首先使用moon new命令创建一个项目。$ moon new try_moonbit_sqlc_plugin_dev $cdtry_moonbit_sqlc_plugin_dev什么是 sqlc 插件sqlc 是一个以SQL作为输入并生成能够“很好地”执行这些 SQL 的 源代码 的工具。1这里所说的“很好地”指的是在静态类型语言中执行 SQL 所需的参数以及执行后得到的结果都被指定类型。2sqlc 的插件本身就是实现这种“很好地输出”的逻辑。插件的输入和输出由 protobuf 定义可以通过标准输入和标准输出与任意编程语言编写的程序进行通信。插件有两种执行方式一种是作为普通命令通过标准输入/输出运行的进程类型另一种是以 wasm 的形式执行。MoonBit 的一大优点就是可以输出wasm因此这次就尝试用 MoonBit 来实现。用于定义插件输入输出的 protobuf 文件位于 sqlc 仓库中Lines 1 to 132 in main。3将其作为子模块添加进来会比较方便。$ git submodule add gitgithub.com:sqlc-dev/sqlc.git sqlcMoonBit 与 protoc这里就不展开介绍 Protocol Buffers4是什么了。从 proto 文件中定义的 schema 出发用于在各种语言中处理 protobuf 格式消息的工具已经有很多了。令人惊喜的是MoonBit 已经存在用于处理 protobuf 消息的工具。5不过这次要使用的 proto 文件6——codegen.proto会触发protoc-gen-mbt中的一个缺陷。只要修改 proto 文件本身即可规避这个问题所以这里直接进行修改。$ mkdir proto $ cp -r sqlc/protos/plugin/codegen.proto proto/codegen.proto将params字段名修改为与json_name一致的parameters。message Query{string text1[json_nametext];string name2[json_namename];string cmd3[json_namecmd];repeated Column columns4[json_namecolumns];repeated Parameter params5[json_nameparameters];repeated string comments6[json_namecomments];string filename7[json_namefilename];Identifier insert_into_table8[json_nameinsert_into_table];}protoc-gen-mbt是作为protoc命令的插件实现的。因此只要有protoc命令即可不过我个人平时更习惯使用buf所以这里选择使用buf。7从 buf 调用 protoc-gen-mbt首先从源码构建protoc-gen-mbt。$gitclone gitgithub.com:moonbitlang/protoc-gen-mbt.git tmp $cdtmp $ moon build -C cli $cpcli/target/native/release/build/protoc-gen-mbt.exe../protoc-gen-mbt.exe $cd..$rm-rf tmp接下来在两个 buf 的配置文件中指定 proto 文件的位置以及刚刚构建好的protoc-gen-mbt可执行文件。buf.yamlversion:v2modules:-path:protobuf.gen.yamlversion:v2inputs:-directory:protoplugins:-local:[./protoc-gen-mbt.exe]out:.opt:# https://github.com/moonbitlang/protoc-gen-mbt?tabreadme-ov-file#arguments-project_namesqlc_plugin-jsonfalse-asyncfalse-usernameyourname使用buf generate命令根据 proto 文件生成 MoonBit 的源代码。$ buf generate生成的代码会作为一个 MoonBit 项目输出。$ tree sqlc_pluginsqlc_plugin├── moon.mod.json└── src└── plugin├── moon.pkg.json└── top.mbt看看 sqlc 插件的输入内容在制作 sqlc 插件之前先来看一下它的输入到底是什么样的。因此这里先尝试将标准输入原样输出到标准错误输出。首先创建一个 shell 可执行文件。sqlc 的插件在异常退出时会把标准错误输出的内容记录到日志中。相反如果是正常退出标准错误输出的内容是不会出现在日志里的这一点需要注意。dump_stdin_to_stderr.sh#!/bin/shcat-2exit1$chmodx dump_stdin_to_stderr.sh为了使用 sqlc 进行代码生成创建一些示例 SQL 文件。$mkdirsqlite $touchsqlite/schema.sql $touchsqlite/query.sqlsqlite/schema.sqlCREATE TABLE authors ( id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,bio text );sqlite/query.sql/* name:get_author:one*/SELECT * FROM authors WHERE id ?LIMIT 1;/* name:list_authors:many*/SELECT * FROM authors ORDER BY name;/* name:create_author:execresult*/INSERT INTO authors ( name,bio ) VALUES (?,?);/* name:delete_author:exec*/DELETE FROM authors WHERE id ?;创建 sqlc 的配置文件指定 SQL 文件和插件shell 可执行文件。sqlc.yamlversion:2plugins:-name:dump_stdin_to_stderrprocess:cmd:./dump_stdin_to_stderr.shsql:-name:sqliteschema:sqlite/schema.sqlqueries:sqlite/query.sqlengine:sqlitedatabase:uri:file:authors?modememorycachesharedcodegen:-out:generatedplugin:dump_stdin_to_stderr执行sqlc generate后dump_stdin_to_stderr.sh输出的内容会原样显示出来。$ sqlc generate main ✭ ✱# package dump_stdin_to_stderrerror generating code: process: error runningcommandp2sqlitesqlite/schema.sqlsqlite/query.sqlb generateddump_stdin_to_stderr* ump_stdin_to_stderr.shmainmainauthorsid0R authorsb integername0R authorsbtext#bio0R authorsbtext虽然直接看并不能理解内容但可以确认确实有 protobuf 格式的二进制数据输入了插件。在 MoonBit 中处理 sqlc 插件的输入终于到了这里可以开始编写 MoonBit 代码了。首先将必要的模块添加到项目中。$ moonaddmoonbitlang/async $ moonaddmoonbitlang/protobuf通过 buf 生成的、定义了 sqlc 插件输入输出的模块需要直接编辑moon.mod.json来进行引用。8deps:{ryota0624/sqlc_plugin:{version:0.1.0,path:./sqlc_plugin},}作为运行时入口点的包其moon.pkg.json如下cmd/main/moon.pkg.json{is-main:true,import:[{path:yourname/try_moonbit_sqlc_plugin_dev,alias:lib},moonbitlang/async/stdio,moonbitlang/async,moonbitlang/async/io,yourname/sqlc_plugin/plugin,moonbitlang/protobuf]}由于GenerateRequest消息中包含了查询名称因此将这些名称输出到标准错误。最后通过调用panic让进程异常退出。cmd/main/main.mbtfnmain{async.run_async_main(main_async)panic()}asyncfnmain_async()-Unit{letinputstdio.stdin.read_all()letrequestlib.parse_generate_request(input.binary())forqueryinrequest.queries{stdio.stderr.write(query.name\n)}}fnparse_generate_request(data:Bytes)-plugin.GenerateRequestraise{protobuf.BytesReader::from_bytes(data)|protobuf.Read::read}使用moon build并指定native作为目标进行构建后会在target/native/release/build/cmd/main/main.exe生成可执行文件。$ moon build --target native在sqlc.yaml中指定该可执行文件。version:2plugins:-name:moonbitprocess:cmd:target/native/release/build/cmd/main/main.exesql:-name:sqliteschema:sqlite/schema.sqlqueries:sqlite/query.sqlengine:sqlitedatabase:uri:file:authors?modememorycachesharedcodegen:-out:generatedplugin:moonbit执行sqlc generate后就会输出查询名称。 sqlc generate# package moonbiterror generating code:process:error running command get_authorlist_authorscreate_authordelete_authorhttps://sqlc.dev/ ↩︎https://docs.sqlc.dev/en/latest/guides/plugins.html ↩︎https://github.com/sqlc-dev/sqlc/blob/main/protos/plugin/codegen.proto ↩︎https://protobuf.dev/ ↩︎https://github.com/moonbitlang/protoc-gen-mbt ↩︎https://github.com/moonbitlang/protoc-gen-mbt ↩︎https://buf.build/product/cli ↩︎https://github.com/ryota0624/try_moonbit_sqlc_plugin/blob/main/moon.mod.json#L4-L8 ↩︎

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询