快速开始

创建工作区

写一个最简单的基础项目实际演练一下 Go workspace

首先,创建 workspace 工作区。

$: mkdir workspace
$: cd workspace
$: go work init

完成以上步骤后,工作区目录就会出现一个新的文件 go.work . 内容是这样的:

go 1.18

因为工作区暂时是空的,所以只有一个版本信息。Go workspace 的使用版本:go version >= 1.18.

创建项目

创建一个基础项目 demo, 过程如下:

$: cd workspace
$: mkdir demo
$: go mod init demo

添加基础代码, demo/main.go:

package main

import "fmt"

func main() {
fmt.Println("hello, go workspace")
}

增加一个基础依赖包: github.com/liujianping/foo , 命令

$ go get github.com/liujianping/foo

这是以前 Go Module 刚发布时写的依赖包,借来直接用。修改 demo/main.go:

package main

import (
"fmt" "github.com/liujianping/foo"
) func main() {
fmt.Println(foo.Greet("workspace"))
}

现在在 demo 目录中运行: go run main.go , 发现 demo 运行失败。

$: go run main.go
main.go:6:2: no required module provides package github.com/x-mod/foo: go.mod file not found in current directory or any parent directory; see 'go help modules'

这时因为在 demo 的父级目录中发现了 go.work 文件,而 go.work 中没有使用任何项目包或依赖包,所以 workspace 工作区无法工作导致。

工作区操作

现在将 demo 项目增加到工作区。

$: cd workspace
$: go work use ./demo

查看工作区文件 go.work:

go 1.18

use ./demo

重新运行项目:

$: cd workspace
$: go run demo/main.go
Go Workspace, 你好! Version 1.0.1

再将 github.com/liujianping/foo clone 到工作区:

$: cd workspace
$: git clone git@github.com:liujianping/foo.git

现在,工作区目录到结构是这样的:

$: cd workspace
$: tree .
.
├── demo
│ ├── go.mod
│ ├── go.sum
│ └── main.go
├── foo
│ ├── foo.go
│ └── go.mod
└── go.work

  

直接修改 foo.go 文件:

package foo

import "fmt"

func Greet(name string) string {
return fmt.Sprintf("%s, 你好! Version 2.0.1", name)
}

版本号修改一下。重新运行 demo 项目:

$: cd workspace
$: go run demo/main.go
Go Workspace, 你好! Version 1.0.1

发现输出并未发生改变。这是因为,github.com/liujianping/foo 虽然代码已经 clone 下来,但在 go.work 文件中尚未使用。

$: cd workspace
$: go work use ./foo

查看工作区文件 go.work:

go 1.18

use (
./demo
./foo
)

再次运行项目:

$: cd workspace
$: go run demo/main.go
Go Workspace, 你好! Version 2.0.1

常用命令总结:# 初始化工作区go work init [moddirs]

--moddirs
是go Module所在的本地目录,如果有多个go module, 用空格分开, 如果为空,则会创建一个空的workspace ==> 生成go.work # 给工作区新增go module
go work use [-r] moddir
或手动编辑go.work文件
-r:
如果带-r,会递归查找-r后面的路径参数下的所有子目录,把所有包含go.mod文件的子目录都添加到go.work文件中
如果某个Go Module的目录已经被加到go.work里了,后面该目录没有go.mod文件了或者该目录被删除了,那对该目录再次执行go work use命令,该目录的use指令会从go.work文件里自动移除。(注意:自动移除要从Go 1.18正式版本才会生效,Go 1.18beta1版本有bug,自动删除不会生效)

go work sync
把go.work文件中的以来同步到workspace包含的module的go.mod文件中

go work edit: 提供了用于修改go.work的命令行接口,主要给工具或脚本使用

go.work

go.work的语法和go.mod类似,包含如下3个指令:

  • go: go的版本,例如 go 1.18

  • use: 添加一个本地磁盘上的Go Module到workspace的主Module集合里。use后面的参数是go.mod文件所在目录相对于workspace目录的相对路径,例如use ./mainuse指令不会添加指定目录的子目录下的Go Module到workspace的主Module集合里。

  • replace: 和go.mod里的 replace指令类似。go.work里的 replace指令可以替换某个Go Module的特定版本或者所有版本的内容。

 

小结

建立项目 workspace 工作区之后,对项目的依赖包的修改不再需要进行实时升级,只需要在本地进行修改,等到项目代码提交时,一并升级即可。虽然,Go workspace 的功能,有点类似 Go module 中的 replace 语句,但是很明显 workspace 在项目统筹方便更加出色,尽早使用起来摆脱依赖恐惧吧。

Golang之工作区workspace的更多相关文章

  1. matlab数据的导入和导出,以matlab工作区workspace为source和destination

    MATLAB支持工作区的保存.用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入. 保存工作区可以通过菜单进行,也可以通过命令窗口进行. 数据导出 1. 保存整个工作区 选择Fil ...

  2. TFS二次开发04——工作区(Workspace)和映射(Mapping)

    在前面几节介绍了怎样读取TFS服务器上的项目以及文件的信息,这一节将介绍怎么建立服务器和本地的映射(Mapping). 引用命名空间 usingMicrosoft.TeamFoundation.Cli ...

  3. 组织Golang代码

    本月初golang官方blog(需要自己搭梯子)上发布了一篇文章,简要介绍了近几个月Go在一 些技术会议上(比如Google I/O.Gopher SummerFest等)的主题分享并伴有slide链 ...

  4. Drone 中的概念:webhooks、workspace、cloning、pipelines、services、plugins、deployments

    webhooks 跳过提交 包含/跳过分支 branches workspace base 属性 path 属性 cloning pipelines 构建步骤 并行执行 group 条件执行 when ...

  5. golang环境安装和配置

    go中环境安装 前言 最近在工作中需要新配置go环境,每次都要去网上查找教程,浪费时间,那么就自己总结下. 下载安装 linuxGolang官网下载地址:https://golang.org/dl/1 ...

  6. 看懂理解 keyboard中 , navigation的设置: 切换工作区和移动窗口到不同的工作区.

    navigation中, 主要有两个方面的内容: 移动窗口到工作区 的shortcuts 切换工作区的shortcuts 首先清楚: 工作区workspace, fedora 23中 好像只有上下方向 ...

  7. 使用Metasploit工作区

    使用Metasploit工作区   Metasploit将所有数据都存储在PostgeSQL服务器中的msf数据库.渗透测试人员经常要使用Metasploit同时执行多个任务.为了避免数据混杂,Met ...

  8. [golang note] 工程组织

    golang项目目录结构 <golang_proj> ├─README                 ├─AUTHORS                 ├─<bin>    ...

  9. [Go] golang的用途和windows搭建环境

    Golang核心编程: 区块链研发工程师(分布式账本技术,互联网数据库技术,特点是去中心化) Go服务器端/游戏软件工程师(现在主流是C C++,处理日志,数据打包,文件处理,美团后台流量支撑,处理大 ...

  10. Go语言实战

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文通过从无到有创建一个利用Go语言实现的非常简单的HttpServe ...

随机推荐

  1. C#自定义控件—仪表盘

    C#用户控件之仪表盘 如何让温度.湿度.压力等有量程的监控值如仪表盘(DashBoard)一样显示? 思路(GDI绘图): 定义属性:(仪表盘的半径.颜色.间隙:刻度圆的半径.颜色.字体:指针的颜色. ...

  2. Time Zone, Leap Year, Date Format, Epoch Time 时区, 闰年, 日期格式

    前言 以前有写过一篇了, 但很乱, 这篇就作为它的整理版吧. Leap Year 闰年 闰年是指那些有 366 天, 二月份有 29号 的年份. 比如 2020年 有 2月29日, 所以 2020 就 ...

  3. HTML / CSS – Email Marketing HTML Template

    前言 虽然现在的 Email Client 有在进步, 但是比起 browser 还是差太远了. 假如你用 HTML5 + CSS3 的方式去写 Email Template 的话是不行的. 这篇特地 ...

  4. 我发布了一款相亲平台《i相遇》

    因缘际会之下,我踏入了相亲平台的领域.起初,是为一位客户打造专属相亲应用,过程中深入体验了众多同类平台,却遗憾地发现它们普遍掺杂着欺诈的阴影--高昂的费用.兼职托儿的身影.以及虚假的钓鱼信息,不一而足 ...

  5. YAML编写应用的资源清单文件(十五)

    上面我们在 Kubernetes 中部署了我们的第一个容器化应用,我们了解到要部署应用最重要的就是编写应用的资源清单文件.那么如何编写资源清单文件呢?日常使用的时候我们都是使用 YAML 文件来编写, ...

  6. 信创环境经典版SuperMap iManager监控外部SuperMap iServer资源失败,无法监控目标GIS服务器CPU与内存使用情况

    一.问题环境 操作系统:银河麒麟kylin V10 CPU:鲲鹏920 SuperMap iServer 10.2.0 SuperMap iManager 10.2.1 二.现象 部署完经典版Supe ...

  7. 【赵渝强老师】删除表和Oracle的回收站

    一.Oracle的Drop Table语句 首先,我们来看一下Oracle Drop Table的语法格式. 解释一下里面的参数: schema Schema表示方案名称,这里可以理解为用户名,缺省为 ...

  8. 利用 Page Visibility API 优化网页性能与用户体验

    在现代 Web 开发中,用户可能会频繁切换标签页,或让网页处于后台运行.为了避免不必要的资源浪费并提升用户体验,合理利用 Page Visibility API 可以在页面不可见时暂停或减少资源的消耗 ...

  9. 《Vue.js 设计与实现》读书笔记 - 第6章、原始值的响应式方案 & 响应式总结

    第6章.原始值的响应式方案 6.1 引入 ref 的概念 既然原始值无法使用 Proxy 我们就只能把原始值包裹起来. function ref(val) { const wrapper = { va ...

  10. Go 语言中值接收者和指针接收者方法调用的自动转换规则详解

    在 Go 语言中,方法的调用规则对于值接收者和指针接收者有一些特别的行为,这使得代码变得更加简洁和易用.我们来详细解释一下"方法值调用规则"和"方法表达式调用规则&quo ...