[zeromicro/go-zero]window下创建链接需要管理员权限才行

2024-01-03 450 views
2

每次敲命令都会出现没权限的提示。 image

问题代码如下,每次执行命令都要创建一次链接。但是在window下这种创建方式是需要管理员权限的。所以需要管理员权限打开的cmd窗口才能创建成功。但是不想每次都用管理员权限打开cmd窗口。所以这里可以改成已经创建成功就不重复创建吧。 image

回答

4

有方法可以把 windows 的 admin 改掉的,这个要自行 google 一下。

4

但是为什么每次执行都需要创建一次链接呢?这样不合理吧。这个创建链接的问题我在几个别的开源库里面也遇到了,window用户太受伤了。

2

不会每次都创建的,只需要创建一次就好了

1

那我每次敲命令都会有这个问题啊,上面代码难道在我电脑运行有问题么。

4

@anqiansong 答案是否定的确实是每执行一次就重新创建了一次:

func init() {
    err := linkProtocGenGoctl()
    if err != nil {
        console.Error("%+v", err)
    }
}

const protocGenGoctl = "protoc-gen-goctl"

func linkProtocGenGoctl() error {
    path, err := env.LookPath("goctl")
    if err != nil {
        return err
    }

    dir := filepath.Dir(path)
    ext := filepath.Ext(path)
    target := filepath.Join(dir, protocGenGoctl)
    if len(ext) > 0 {
        target = target + ext
    }

    err = syscall.Unlink(target)
    if err != nil && !os.IsNotExist(err) {
        return err
    }

    return os.Symlink(path, target)
}

我看了老半天也没看到哪里在判断 protoc-gen-goctl 已经存在了,然后安装了工具发现就是会每次 syscall.Unlink 然后再 os.Symlink

3

我觉得可以在这里获取一下链接文件的源文件,如果是同一个文件就不用重建了,否则可能是篡改过的。

func linkProtocGenGoctl() error {
    path, err := env.LookPath("goctl")
    if err != nil {
        return err
    }

    dir := filepath.Dir(path)
    ext := filepath.Ext(path)
    target := filepath.Join(dir, protocGenGoctl)
    if len(ext) > 0 {
        target = target + ext
    }

    tmp := make([]byte, len(path)+16)
    n, err := syscall.Readlink(target, tmp)
    if err == nil && string(tmp[:n]) == path {
        return nil
    }

    err = syscall.Unlink(target)
    if err != nil && !os.IsNotExist(err) {
        return err
    }

    return os.Symlink(path, target)
}