不使用go get也能玩转Golang?这是真的吗

不使用go get也能玩转Golang?这是真的吗 在家(Ubuntu 18.04)中,我可以这样做:

go get gopkg.in/ldap.v2

然而,在工作环境(Red Hat 7)中,这行不通,因为我们的代理服务器阻止了访问(出于安全原因,我的工作GNU/Linux环境被有意隔离)。不过,在工作时,我也可以从我的Windows 10主机下载文件。

那么……有没有办法利用我在Windows 10上的下载能力来获取Go包,然后将它们复制到Red Hat主机上?有什么想法吗?

请注意:我在diasp.org(Diaspora社交网络)上发布了这个问题。如果有人在那里回答了,我会用详细信息更新这个主题。


更多关于不使用go get也能玩转Golang?这是真的吗的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

我只能想到在Windows上下载该软件包,然后通过 scp 通过SSH复制到你的Linux主机。如果你被允许安装WSL或此时完全使用WSL,你也可以使用 rsync

更多关于不使用go get也能玩转Golang?这是真的吗的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢路易斯。您所说的“下载包”是指在Windows上运行 go get 吗?还是指其他操作?比如从 github.com(或 gitlab.com,或其他位置)克隆该包?目前我在Windows上没有安装Go。干杯,-Randy

哦,我明白了

我可以从我的 Windows 10 主机下载项目

意思是你已经安装了 go 工具。实际上,go 工具所做的与使用定义的版本控制系统克隆仓库并进行一些校验和计算并无不同。

我会克隆或下载该仓库,然后使用 scp 命令将其传输到你的机器上。

实际上,go 工具所做的与克隆仓库并无不同

非常有趣。当我添加 -x 参数时,可以看到

go get -x gopkg.in/ldap.v2

变成了一系列 cdgit clonegit submodule update 命令,例如:

git clone https://gopkg.in/ldap.v2 (myhomedir)/go/src/gopkg.in/ldap.v2

干杯!

问题已解决。通过在 https_proxy 变量中表达密码时对特殊字符使用 %xx 编码,使得在 Red Hat 7 上能够成功运行 go get。因此,我之前认为此类访问不再被允许的假设是错误的。同时了解到,工作中使用的 go 1.18 版本不会像家中使用的 go 1.10 版本那样留下 .git 目录。我相信这反映了模块管理功能在 Go 中的落地(大约是从 1.14 版本开始?)。干杯!

我安装了Go 1.19的Windows msi安装包。在命令提示符下我运行:

go get -x gopkg.in/ldap.v2

这产生了5行以 # get https://proxy.golang.org/...b0361.mod: 开头的内容。

唉,它最终以超时错误结束:“连接的主机未能响应。”

然而,如果我将URL复制并粘贴到Firefox中,我可以毫无延迟地看到mod文件。因此,看起来Firefox的行为与命令提示符下的go get有所不同。我会继续思考这个问题。

干杯

是的,完全可以。你可以通过离线方式获取Go模块,然后手动复制到Red Hat主机上。以下是具体步骤:

方法一:使用vendor目录(推荐)

在Windows主机上:

# 1. 创建测试项目
mkdir temp-project
cd temp-project

# 2. 初始化go.mod
go mod init temp-project

# 3. 添加需要的依赖
go mod edit -require gopkg.in/ldap.v2@latest

# 4. 下载所有依赖到vendor目录
go mod vendor

# 5. 将整个项目(包括vendor目录)复制到Red Hat主机

在Red Hat主机上:

# 1. 复制项目到工作目录
cp -r temp-project /your/work/directory/

# 2. 启用vendor模式
export GOFLAGS="-mod=vendor"

# 3. 使用依赖
cd /your/work/directory/temp-project
go build

方法二:直接复制模块缓存

在Windows主机上:

# 1. 获取模块
go get gopkg.in/ldap.v2@latest

# 2. 找到模块缓存位置
go env GOMODCACHE
# 通常为:%USERPROFILE%\go\pkg\mod

# 3. 复制gopkg.in/ldap.v2目录
# 例如:复制 gopkg.in/ldap.v2@v2.5.1 目录

在Red Hat主机上:

# 1. 创建模块缓存目录(如果不存在)
mkdir -p ~/go/pkg/mod

# 2. 将复制的模块放入缓存
cp -r gopkg.in/ldap.v2@v2.5.1 ~/go/pkg/mod/

# 3. 在你的项目中初始化go.mod
go mod init your-project

# 4. 添加依赖
go mod edit -require gopkg.in/ldap.v2@v2.5.1

方法三:使用go mod download + 手动传输

在Windows主机上:

# 1. 创建go.mod文件
echo 'module temp

go 1.21

require gopkg.in/ldap.v2 v2.5.1' > go.mod

# 2. 下载模块到缓存
go mod download

# 3. 生成校验和文件
go mod tidy

# 4. 打包模块缓存
cd %USERPROFILE%\go\pkg\mod
tar -czf modules.tar.gz gopkg.in/

在Red Hat主机上:

# 1. 解压模块
mkdir -p ~/go/pkg/mod
tar -xzf modules.tar.gz -C ~/go/pkg/mod/

# 2. 创建项目go.mod文件
cat > go.mod << 'EOF'
module your-project

go 1.21

require gopkg.in/ldap.v2 v2.5.1
EOF

# 3. 复制go.sum文件(如果有)
# 4. 验证依赖
go mod verify

方法四:使用replace指令(临时解决方案)

在Red Hat主机上直接编辑go.mod:

module your-project

go 1.21

require gopkg.in/ldap.v2 v2.5.1

replace gopkg.in/ldap.v2 => ../local-path/ldap.v2

然后将从Windows下载的包源码放在../local-path/ldap.v2目录中。

验证安装

无论使用哪种方法,最后都可以这样验证:

// main.go
package main

import (
    "fmt"
    ldap "gopkg.in/ldap.v2"
)

func main() {
    fmt.Println("LDAP package version:", ldap.Version)
    conn, err := ldap.Dial("tcp", "localhost:389")
    if err != nil {
        fmt.Println("Package imported successfully")
    }
    defer conn.Close()
}

运行:

go run main.go

这些方法都不需要直接使用go get,完全可以在隔离环境中工作。选择哪种方法取决于你的具体需求和环境限制。

回到顶部