继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Glide--------Golang依赖包解决工具之错误实践

holdtom
关注TA
已关注
手记 1703
粉丝 240
获赞 991


1. 背景

     不论是开发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. 总结

以需求驱动技术,技术本身没有优略之分,只有业务之分。

©著作权归作者所有:来自51CTO博客作者asd1123509133的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP