Skip to content

Commit

Permalink
fix: PkgSourceDir 现在支持返回子路径
Browse files Browse the repository at this point in the history
  • Loading branch information
caixw committed May 10, 2024
1 parent 833596c commit 8b3dbdc
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 11 deletions.
16 changes: 7 additions & 9 deletions mod.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ var (
stdSource = filepath.Join(build.Default.GOROOT, "src")
)

// 查找模块 pkgPath 的源码目录
// 查找包 pkgPath 的源码目录
//
// 如果 pkgPath 是标准库的名称,如 encoding/json 等,则返回当前使用的 Go 版本对应的标准库地址。
// 其它情况则从 modDir 指向的 go.mod 中查找 require 或是 replace 字段的定义,
// 并根据这些定义找到其指向的源码路径。
//
// modPath 需要查找的包路径,如果指向的是模块下的包级别的导出路径,则会尝试使用 strings.HasPrefix 与 require 指令进行对比;
// modDir go.mod 所在的目录;
// pkgPath 需要查找的包路径,如果指向的是模块下的包级别的导出路径,则会尝试使用 strings.HasPrefix 与 require 指令进行对比;
// modDir go.mod 所在的目录,将在该文件中查找 pkgPath 指定的目录
// replace 是否考虑 go.mod 中的 replace 指令的影响;
//
// NOTE: 这并不会检测 dir 指向目录是否真实且准确。
Expand All @@ -52,17 +52,15 @@ func ModSourceDir(pkgPath, modDir string, replace bool) (dir string, err error)
if !strings.HasPrefix(pkgPath, pkg.Mod.Path) {
continue
}
suffix := strings.TrimPrefix(pkgPath, pkg.Mod.Path)

if !replace {
return filepath.Join(pkgSource, pkg.Mod.Path+"@"+pkg.Mod.Version), nil
return filepath.Join(pkgSource, pkg.Mod.Path+"@"+pkg.Mod.Version+suffix), nil
}

index := slices.IndexFunc(mod.Replace, func(r *modfile.Replace) bool {
return r.Old.Path == pkg.Mod.Path
})

index := slices.IndexFunc(mod.Replace, func(r *modfile.Replace) bool { return r.Old.Path == pkg.Mod.Path })
if index < 0 {
return filepath.Join(pkgSource, pkg.Mod.Path+"@"+pkg.Mod.Version), nil
return filepath.Join(pkgSource, pkg.Mod.Path+"@"+pkg.Mod.Version+suffix), nil
}

p := mod.Replace[index].New.Path
Expand Down
8 changes: 6 additions & 2 deletions mod_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ package source

import (
"io/fs"
"path/filepath"
"runtime"
"strings"
"testing"

"github.com/issue9/assert/v4"
Expand All @@ -25,10 +27,12 @@ func TestModSourceDir(t *testing.T) {
// require

dir, err = ModSourceDir("github.com/issue9/assert/v4", "./", false)
a.NotError(err).FileExists(dir)
a.NotError(err).FileExists(dir).
True(strings.HasSuffix(filepath.ToSlash(dir), "assert/[email protected]"))

dir, err = ModSourceDir("github.com/issue9/assert/v4/rest", "./", false)
a.NotError(err).FileExists(dir)
a.NotError(err).FileExists(dir).
True(strings.HasSuffix(filepath.ToSlash(dir), "assert/[email protected]/rest"))

// replace

Expand Down

0 comments on commit 8b3dbdc

Please sign in to comment.