使用gogs和glide来轻松拉取golang第三方库
golang的第三方代码拉取一直是让人头疼的问题,在github托管的代码还好,托管在其他网站上的代码总会由于大家都懂的原因,无法访问。纵使是github,在拉取文件数量较多的库时,也是比较慢的。
有没有比较好的解决方案呢?有的,这里给大家提供一个:gogs + glide。
gogs简介

官网
无需多做介绍,对标Gitlab即可。gogs使用golang开发,只要是go语言支持的平台它都支持,其搭建非常简单,这也是我们使用它而不用Gitlab的原因。
glide 简介

glide是Go的包管理工具,对标godep,支持私有的Repos和Forks,这就可以和咱们的gogs一起愉快的玩耍了。
具体使用过程,我就不多说了,大家百度一下,资料很多。下面开始讲一下搭建过程:
安装Mysql
gogs依赖数据库,我们选择使用Mysql,网上安装方法很多,不赘述
安装gogs
安装gogs方式很多,比如
- 源码安装
- 二进制安装
- 包安装
我们这里讲的是源码安装.
前提:系统里需要先安装Go语言,如果没安装,网上教程很多
从源码安装
# 下载并安装依赖
$ go get -u github.com/gogs/gogs
# 构建主程序
$ cd $GOPATH/src/github.com/gogs/gogs
$ go build
配置与运行
接着上一步,然后输入以下指令
./gogs web
这时候发现报错,缺少文件,新建文件$GOPATH/src/github.com/gogs/gogs/custom/conf/app.ini ,内容为
APP_NAME = Gogs
RUN_USER = fabric
RUN_MODE = prod
[database]
DB_TYPE = mysql
HOST = 127.0.0.1:3306
NAME = gogs
USER = gogs
PASSWD = 123456
SSL_MODE = disable
PATH = data/gogs.db
[repository]
ROOT = /home/fabric/gogs-repositories
[server]
DOMAIN = localhost
HTTP_PORT = 3000
ROOT_URL = http://localhost:3000/
DISABLE_SSH = false
SSH_PORT = 22
START_SSH_SERVER = false
OFFLINE_MODE = false
[mailer]
ENABLED = false
[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION = false
ENABLE_CAPTCHA = true
REQUIRE_SIGNIN_VIEW = false
[picture]
DISABLE_GRAVATAR = false
ENABLE_FEDERATED_AVATAR = false
[session]
PROVIDER = file
[log]
MODE = file
LEVEL = Info
ROOT_PATH = /opt/gopath/src/github.com/gogs/gogs/log
[security]
INSTALL_LOCK = true
SECRET_KEY = UfjSHvQULpjPmJk
注意上文里的RUN_USER = fabric,这里是运行gogs程序的用户,默认为git,我们可以改为自己的默认用户,我的叫做fabric.
再次运行./gogs web,打开http://localhost:3000/发现已经可以看到gogs的安装页面了.
全部默认即可.
尝试拉取代码
我们新建好仓库后,尝试拉取代码
git clone http://localhost:3000/fabric/test.git
拉取成功!
但这不是我们能满足的,localhost:3000这样子太丑陋了!我们希望看到类似https://github.com/jinzhu/gorm.git这样的形式.
让我们继续行动吧!
nginx反向代理
我们使用Nginx来进行反向代理,以提供比较优雅的域名方式访问.
安装Nginx
老话,百度一下,你就知道哈.
配置域名
咱们仿造github,起名githubs.
在/etc/nginx/sites-available目录下新建文件githubs,内容为
server {
server_name githubs.com;
listen 80;
location / {
proxy_pass http://127.0.0.1:3000/;
}
}
然后进入 /etc/nginx/sites-enabled 中,执行 ln -s ../sites-available/githubs,以启用这个配置文件。 最后重启 nginx 就好了,Ubuntu 下是
sudo service nginx restart
然后在hosts里面添加映射
$ vim /etc/hosts
127.0.0.1 gitbar.com
拉取代码库
git clone http://githubs.com/fabric/test.git
可以看到代码可以正常拉取了.
但是这样还不够,我们需要的是https方式的拉取,现在只是http
配置https
生成证书
输入以下指令生成证书
$ cd /etc/nginx/
$ sudo mkdir ssl
$ sudo openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /etc/nginx/ssl/githubs.key -out /etc/nginx/ssl/githubs.crt
最后一步会要求输入一些信息
Generating a 2048 bit RSA private key
............................................+++
...................+++
writing new private key to '/etc/nginx/ssl/githubs.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:githubs.com
Email Address []:
其中Common Name字段是必填的,就是咱们的域名githubs.com,其余直接回车跳过.
修改nginx虚拟主机配置
修改之前生成的虚拟主机配置文件
$ vim /etc/nginx/sites-available/githubs
内容为:
server {
listen 443 ssl;
server_name www.githubs.com;
ssl on;
ssl_certificate /etc/nginx/ssl/githubs.crt;
ssl_certificate_key /etc/nginx/ssl/githubs.key;
location / {
proxy_pass http://127.0.0.1:3000/;
}
}
server {
listen 80;
server_name www.githubs.com;
location / {
proxy_pass http://127.0.0.1:3000/;
}
}
修改gogs配置
修改$GOPATH/src/github.com/gogs/gogs/custom/conf/app.ini 文件,修改server字段为
[server]
DOMAIN = localhot
HTTP_PORT = 3000
ROOT_URL = https://githubs.com/
DISABLE_SSH = false
SSH_PORT = 22
START_SSH_SERVER = false
OFFLINE_MODE = false
拉取代码
使用https方式拉取代码,报错:
fatal: unable to access 'https://www.githubs.com/sn/test.git/':
server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
解决方案:
跳过http的ssl证书验证
git config --global http.sslverify false
再次尝试拉取,发现可以拉取代码了.
使用glide来设置代码映射
我们在拉取golang.org/x/*这样的代码库时候,经常发现报错,主要因为被墙的原因.
其实这些代码都在github有托管仓库,传统的解决方式可能是这样的 :
$ cd /opt/gopath/src/github.com/golang
$ git clone https://github.com/golang/net.git
$ git clone https://github.com/golang/sys.git
$ ln -s /opt/gopath/src/github.com/golang /opt/gopath/src/golang.org/x
这样的方式很麻烦,可不可以设置映射关系,当拉取golang.org/x/net包时候,会自动拉取github.com/golang/net内容,并放置在golang.org/x/net目录下呢?
有的,glide可以帮我们做这样的事情.让我们先安装它.
安装glide
具体安装方式网上很多,我之前也写了这个,可以参照下 go包管理工具glide使用方法
设置mirrors
比如我们需要拉取mg.org/x/test包,他不幸的被墙了,但是代码托管在咱们自己搭建的gogs上,即githubs.com/fabric/test上.我们只需要设置mirrors即可.
命令很简单
$ glide mirror set https://mg.org/x/test https://githubs.com/fabric/test.git --vcs git
查看mirrors文件内容
$ vim ~/.glide/mirrors.yaml
repos:
- original: https://mg.org/x/test
repo: https://githubs.com/fabric/test.git
vcs: git
拉取代码
我们可以用glide get方式来拉取代码.比如我们有这样的代码库github.com/mango/template
这个文件夹首先是不存在
$ cd $GOPATH/src/github.com
$ mkdir -p mango/template
$ cd mango/template
$ glide init
$ glide get mg.org/x/test
[INFO] Loading mirrors from mirrors.yaml file
[INFO] Preparing to install 1 package.
[INFO] Attempting to get package mg.org/x/test
[INFO] --> Gathering release information for mg.org/x/test
[INFO] --> Adding mg.org/x/test to your configuration
[INFO] Downloading dependencies. Please wait...
[INFO] --> Fetching mg.org/x/test
[INFO] Resolving imports
[INFO] Downloading dependencies. Please wait...
[INFO] Exporting resolved dependencies...
[INFO] --> Exporting mg.org/x/test
[INFO] Replacing existing vendor dependencies
代码成功拉取了!
结语
我们可以将常用的一些第三方代码库先拉取到自己部署的gogs上,然后使用mirrors来形成映射,这样拉取下来的代码就可以放置在正确的目录里.
至此,整个流程就结束了,咱们可以丝滑的拉取代码了.
使用gogs和glide来轻松拉取golang第三方库的更多相关文章
- SourceTree使用详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决)
前言: 俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的.目前市面上比较流行的Git可视化管理工具有SourceTree.Github Desktop.Tortois ...
- K8s 从懵圈到熟练 – 镜像拉取这件小事
作者 | 声东 阿里云售后技术专家 导读:相比 K8s 集群的其他功能,私有镜像的自动拉取,看起来可能是比较简单的.而镜像拉取失败,大多数情况下都和权限有关.所以,在处理相关问题的时候,我们往往会轻松 ...
- 版本控制git之三-多人协作 变基 推送 拉取 删除远程分支
版本控制git之三-多人协作 wangfeng7399已关注0人评论350人阅读2019-02-20 21:33:08 如果你想获得一份已经存在了的 Git 仓库的拷贝,比如说,你想为某个开源 ...
- 【Copy攻城狮日志】docker搭建jenkins拉取svn代码打包vue项目部署到nginx
↑开局一张图,故事全靠编↑ 前言 打开搜索引擎输入『Copy攻城狮』,发现最新的一条记录已经是去年的4月,意味着我又有一年时间没有再总结成长了.习惯了“温水煮青蛙”的日子,无论是经验水平还是薪资收入, ...
- github拉取和推送
登入github 创建一个开源项目 然后打开安装好的git 首先进入一个指定的文件夹 例如: 1)E:\>cd miaov/testGit 回车 进入E盘的testGit文件夹 2)E:\mia ...
- git&sourcetree安装及在IntelliIJ下拉取项目基础使用
be careful: 1)git版本与Sourcetree版本最好一致 ,不能git为2.5,sourcetree为1.8 2)先安装git再安装Sourcetree 3)拥有git和sourcet ...
- ***git 本地提交后如果让服务器上的GIT 自动更新拉取
Q: 最近配了个服务器,用的GIT,本地提交后服务器必须再拉取一下才能更新出来..求个提交后自动更新的方法 A: 最佳工具 git hook post-update.sample 改名为post-up ...
- Spark Streaming中向flume拉取数据
在这里看到的解决方法 https://issues.apache.org/jira/browse/SPARK-1729 请是个人理解,有问题请大家留言. 其实本身flume是不支持像KAFKA一样的发 ...
- 用setTimeout 代替 setInterval实时拉取数据
在开发中,我们常常碰到需要定时拉取网站数据,如: setInterval(function(){ $.ajax({ url: 'xx', success: function( response ){ ...
随机推荐
- ZT 苍天助曹不助汉哪
诸葛亮能夜观星象,但为什么在上方谷一役中,孔明没有测出突如其来的大雨,却高呼“苍天助曹不助汉哪”断送了自己的性命,这是为什么 谋事在人,成事在天. 雁过留影 3级 2011-04-18 天命不可违 ...
- OC基础数据类型-NSNumber
1.NSNumber:专门用来装基础类型的对象,把整型.单精度.双精度.字符型等基础类型存储为对象 //基本数据类型 //专门用来装基础类型的对象 NSNumber * intNumber = [[N ...
- 六种排序算法的JavaScript实现以及总结
最近几天在系统的复习排序算法,之前都没有系统性的学习过,也没有留下过什么笔记,所以很快就忘了,这次好好地学习一下. 首先说明为了减少限制,以下代码通通运行于Node V8引擎而非浏览器,源码在我的Gi ...
- xml-apis-ext.jar
xml-apis-ext.jar,hightcharts导出图片是解决乱码需要用到的一个包
- BZOJ 3680: 吊打XXX (模拟退火)
//yy:今天简单入门学了下ORZ 爬山算法:兔子朝着比现在高的地方跳去.它找到了不远处的最高山峰.但是这座山不一定是珠穆朗玛峰.这就是爬山算法,它不能保证局部最优值就是全局最优值. 模拟退火:兔子喝 ...
- HBase的rowkey排序和scan输出顺序
本文目的:搞清楚HBase里面行与行之间的排序排序规则,如何正序和反序输出扫描结果. 明确: HBase里面同一列的元素按照rowkey进行排序,排序规则是rowkey的ASCII码排序,小的在前大的 ...
- python-二维数组实现90度旋转
本篇主要介绍了对一个N*N的数组,如果进行90度的旋转 首先,定义一个一维数组很简单,如下: a = [i for i in range(10)] print(a) -----结果----- 0, 1 ...
- python中的sum函数.sum(axis=1)
看起来挺简单的样子,但是在给sum函数中加入参数.sum(a,axis=0)或者是.sum(axis=1) 就有点不解了 在我实验以后发现 我们平时用的sum应该是默认的axis=0 就是普通的相加 ...
- java 中重载(Overload)和重写(Override)的区别
首先重载和重写是应用于两个不同场景下面的两种不同的手段: 两者各自的特征: 重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不 ...
- Linux下的压缩解压缩命令
*.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— *.gz ...