Glide--------Golang依赖包解决工具之错误实践
1. 背景
专注于为中小企业提供成都网站设计、成都网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业资阳免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上1000家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题。Java有牛逼轰轰的Maven和Gradle。 Golang亦有godep、govendor、glide、gvt、gopack等等,本文主要给大家介绍gilde。 glide是Golang的包管理工具,是为了解决Golang依赖问题的。 为什么需要glide? 原因很简单,Go 语言原生包管理的缺陷。罗列一下golang的 get 子命令管理依赖有很多大缺陷:
* 能拉取源码的平台很有限,绝大多数依赖的是 github.com
* 不能区分版本,以至于令开发者以最后一项包名作为版本划分
* 依赖 列表/关系 无法持久化到本地,需要找出所有依赖包然后一个个 go get
* 只能依赖本地全局仓库(GOPATH/GOROOT),无法将库放置于局部仓库($PROJECT_HOME/vendor)
2. Error问题
项目中使用到了golang.org/x/crypto/ssh包,而由于国内网络原因,无法直接下载,需要提前从github.com/golang/crypto下载然后放到指定位置
* 项目中glide依赖初始化
[lisea@lisea test]$ glide init [INFO] Generating a YAML configuration file and guessing the dependencies [INFO] Attempting to import from other package managers (use --skip-import to skip) [INFO] Scanning code to look for dependencies [INFO] --> Found reference to github.com/pkg/sftp [INFO] --> Found reference to golang.org/x/crypto/ssh [INFO] Writing configuration file (glide.yaml) [INFO] Would you like Glide to help you find ways to improve your glide.yaml configuration? [INFO] If you want to revisit this step you can use the config-wizard command at any time. [INFO] Yes (Y) or No (N)? Y [INFO] Loading mirrors from mirrors.yaml file [INFO] Looking for dependencies to make suggestions on [INFO] --> Scanning for dependencies not using version ranges [INFO] --> Scanning for dependencies using commit ids [INFO] Gathering information on each dependency [INFO] --> This may take a moment. Especially on a codebase with many dependencies [INFO] --> Gathering release information for dependencies [INFO] --> Looking for dependency imports where versions are commit ids Y [INFO] Here are some suggestions... [INFO] The package github.com/pkg/sftp appears to have Semantic Version releases (http://semver.org). [INFO] The latest release is 1.2.0. You are currently not using a release. Would you like [INFO] to use this release? Yes (Y) or No (N) [INFO] Would you like to remember the previous decision and apply it to future [INFO] dependencies? Yes (Y) or No (N) Y [INFO] Updating github.com/pkg/sftp to use the release 1.2.0 instead of no release [INFO] The package github.com/pkg/sftp appears to use semantic versions (http://semver.org). [INFO] Would you like to track the latest minor or patch releases (major.minor.patch)? [INFO] Tracking minor version releases would use '>= 1.2.0, < 2.0.0' ('^1.2.0'). Tracking patch version [INFO] releases would use '>= 1.2.0, < 1.3.0' ('~1.2.0'). For more information on Glide versions [INFO] and ranges see https://glide.sh/docs/versions [INFO] Minor (M), Patch (P), or Skip Ranges (S)? P [INFO] Would you like to remember the previous decision and apply it to future [INFO] dependencies? Yes (Y) or No (N) Y [INFO] Updating github.com/pkg/sftp to use the range ~1.2.0 instead of commit id 1.2.0 [INFO] Configuration changes have been made. Would you like to write these [INFO] changes to your configuration file? Yes (Y) or No (N) Y [INFO] Writing updates to configuration file (glide.yaml) [INFO] You can now edit the glide.yaml file.: [INFO] --> For more information on versions and ranges see https://glide.sh/docs/versions/ [INFO] --> For details on additional metadata see https://glide.sh/docs/glide.yaml/
* 初始化后生成的依赖如下:(glide.yaml)
[lisea@lisea test]$ cat glide.yaml package: test import: - package: github.com/pkg/sftp version: ~1.2.0 - package: golang.org/x/crypto/ssh
* glide安装依赖[ERROR报错]
[lisea@lisea test]$ glide install [INFO] Loading mirrors from mirrors.yaml file [INFO] Lock file (glide.lock) does not exist. Performing update. [INFO] Loading mirrors from mirrors.yaml file [INFO] Downloading dependencies. Please wait... [INFO] --> Fetching golang.org/x/crypto/ssh [INFO] --> Fetching updates for github.com/pkg/sftp [WARN] Unable to checkout golang.org/x/crypto/ssh [ERROR] Update failed for golang.org/x/crypto/ssh: Cannot detect VCS [ERROR] Failed to do initial checkout of config: Cannot detect VCS
3. ERROR解决
经通过度娘查询一圈发现,十个结果九个一样内容(在此鄙视抓内容的站点和纯copy的博主三秒种),最后在glide开源点github上的issue上找到解决方式
* 修改glide生成的glide.yaml文件
package: test import: - package: github.com/pkg/sftp version: ~1.2.0 - package: golang.org/x/crypto/ssh
修改为:
package: test import: - package: github.com/pkg/sftp version: ~1.2.0 - package: golang.org/x/crypto subpackages: - ssh
* 重新更新下载依赖
[lisea@lisea test]$ glide up [INFO] Loading mirrors from mirrors.yaml file [INFO] Downloading dependencies. Please wait... [INFO] --> Fetching updates for golang.org/x/crypto [INFO] --> Fetching updates for github.com/pkg/sftp [INFO] --> Detected semantic version. Setting version for github.com/pkg/sftp to 1.2.0 [INFO] Resolving imports [INFO] --> Fetching updates for github.com/kr/fs [INFO] --> Fetching updates for github.com/pkg/errors [INFO] Downloading dependencies. Please wait... [INFO] Setting references for remaining imports [INFO] Exporting resolved dependencies... [INFO] --> Exporting github.com/pkg/errors [INFO] --> Exporting github.com/pkg/sftp [INFO] --> Exporting golang.org/x/crypto [INFO] --> Exporting github.com/kr/fs [INFO] Replacing existing vendor dependencies [INFO] Project relies on 4 dependencies.
successfully 成功解决
4. 总结
以需求驱动技术,技术本身没有优略之分,只有业务之分。
标题名称:Glide--------Golang依赖包解决工具之错误实践
网站地址:http://pwwzsj.com/article/peiscc.html