Golang开发中该选用CLI还是包管理?
Golang开发中该选用CLI还是包管理? 大家好,
我一直在考虑发布我正在进行的项目(我的博士毕业项目),但我有一些疑问/问题。如果你们中的任何人能给我一些想法(链接、关键词等),我将不胜感激。
该项目是一个并发测试框架。它以 Go 源代码作为输入,自动进行插装并收集一组跟踪信息,然后对收集(存储)的数据进行一些分析。其最终重点是探索交错空间并覆盖一些并发覆盖标准。
为了实现这一点,我向运行时注入了一些额外的代码(通过预先编写的补丁),连接到 SQL 数据库并查询数据库进行分析。因此,它不是一个可以通过包直接使用的简单 API。然而,我一直在考虑通过 Go 内置的 “testing” 包来构建这个项目。这样,用户可以在单元测试的基础上增强一些并发测试;但我不确定这有多可行。
综上所述,您认为哪种是更好的选择?对于这样的工具,CLI 还是包更合适?做出这样的决定需要考虑哪些因素?非常感谢任何意见。如果您有任何问题,我非常乐意澄清。
祝好
更多关于Golang开发中该选用CLI还是包管理?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
感谢这些想法。我非常喜欢同时拥有命令行界面和包的设计(命令行界面使用该包)。
这将是一个研究工具,而非用于生产环境。虽然我同意您关于SQL是一个巨大依赖项的说法,但我认为研究人员不会介意尝试这个工具或在它之上进行构建。数据及其关系(以及随之而来的查询)可能会变得极其庞大和复杂。
更多关于Golang开发中该选用CLI还是包管理?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
几点想法,或许能帮助你思考这个问题……
- 引入 SQL 数据库会带来严重的依赖问题。我建议重新考虑如何在不使用数据库的情况下管理数据。
- 目前 Go 的测试有
Test*和Benchmark*;我想你可以添加第三种(Analyze*?)。但是为了使用这个功能而去修改 Go 源代码,似乎代价太大了。
我建议先创建一个包,然后利用这个包提供一个命令行界面。这将为用户提供一个如何使用它的具体示例。
祝你好运!
对于你的并发测试框架项目,选择CLI还是包管理主要取决于使用场景和集成方式。以下是具体分析:
1. CLI的优势和示例: 如果你的工具需要独立运行、处理文件系统操作或与外部系统交互,CLI是更合适的选择。特别是涉及源代码插装、数据库连接等操作时。
// 示例CLI结构
package main
import (
"flag"
"log"
)
func main() {
inputDir := flag.String("input", ".", "输入Go源代码目录")
outputDir := flag.String("output", "./instrumented", "插装后代码输出目录")
dbConn := flag.String("db", "", "数据库连接字符串")
flag.Parse()
// 执行插装和分析流程
if err := instrumentAndAnalyze(*inputDir, *outputDir, *dbConn); err != nil {
log.Fatal(err)
}
}
func instrumentAndAnalyze(inputDir, outputDir, dbConn string) error {
// 实现插装、数据库连接和分析逻辑
return nil
}
2. 与testing包集成的方案:
如果你想与Go测试框架深度集成,可以创建测试辅助包。用户通过go test命令触发并发测试:
// 示例测试辅助包
package concurrencytest
import (
"testing"
"database/sql"
)
func EnableConcurrencyTesting(t *testing.T, db *sql.DB) {
// 在测试开始时注入代码
t.Helper()
// 实现跟踪收集逻辑
}
// 用户使用示例
func TestConcurrentOperation(t *testing.T) {
db, _ := sql.Open("postgres", "connection_string")
defer db.Close()
EnableConcurrencyTesting(t, db)
// 用户的并发测试代码
}
3. 混合方案: 考虑同时提供CLI和包。CLI用于初始化和配置,包用于测试运行时集成:
// CLI部分负责初始设置
func initProject(configPath string) {
// 生成配置文件、建立数据库等
}
// 包部分提供测试接口
type TestHarness struct {
db *sql.DB
}
func NewTestHarness(dbConn string) (*TestHarness, error) {
// 初始化测试环境
return &TestHarness{}, nil
}
func (h *TestHarness) RunTest(testFunc func()) error {
// 执行测试并收集跟踪数据
return nil
}
关键考虑因素:
- 如果用户需要频繁在CI/CD流水线中运行,CLI更合适
- 如果需要与现有测试代码深度集成,包方案更好
- 涉及源代码修改和外部依赖的操作更适合CLI
- 考虑提供两种方式:CLI进行环境准备,包进行测试执行
根据你的描述,由于涉及运行时代码注入和数据库操作,建议以CLI为主要接口,同时提供有限的包API供高级用户集成到测试流程中。

