快速开始

创建工作区

写一个最简单的基础项目实际演练一下 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. .NET 压缩/解压文件

    本文为大家介绍下.NET解压/压缩zip文件.虽然解压缩不是啥核心技术,但压缩性能以及进度处理还是需要关注下,针对使用较多的zip开源组件验证,给大家提供技术选型 目前了解到的常用技术方案有Syste ...

  2. 工具 – Vitest 与单元测试

    前言 Vitest 是一款配搭 Vite 的前端单元测试工具,可以用于取代 Jasmine 和 Jest. 我先聊一下测试,每当添加新代码或修改旧代码后,我们多少都得测试一下,以确保功能正确才能交付. ...

  3. 多表查询 —— 内连接&外连接&子查询

    连接查询 内连接 1.查询语法 -- 隐式内连接 select 字段列表 from 表1, 表2... where 条件; -- 显式内连接 select 字段列表 from 表1 [INNER] j ...

  4. QT原理与源码分析之QT对象类型QObject源码中的间接的设计思想

    这一篇文章介绍QT框架中QT对象类型QObject类型的源代码在设计上的一个比较优秀的设计思想. QObject类型定义 QObject 直接来看QObject的源代码.为了表达更简洁更直观,这里省略 ...

  5. Windows安装Powershell7.x

    事件起因: 由于需要运行一个脚本,但是该脚本是广大网友群众使用Powershell7写的,我自带的是Powershell5,运行过程中总是出现莫名其妙的问题,于是决定将Powershell升级到Pow ...

  6. 【赵渝强老师】大数据工作流引擎Oozie

    一.什么是工作流? 工作流(WorkFlow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算.工作流要解决的主要问题是:为实现某 ...

  7. 2024年9月中国数据库排行榜:openGauss系多点开花,根社区优势明显

    在墨天轮发布的9月中国数据库流行度排行榜中,中国数据库产业格局进一步聚集刷新,呈现出3大显著特征: 开源势力力争上游显优势领先潮流: openGauss 开源根社区优势明显: 阿里华为两极鼎立云上云下 ...

  8. iOS比较枚举NSOrderedSame NSOrderedAscending NSOrderedDescending使用小结

    项目开发中偶然间看到这种比较枚举,之前没注意过,仔细研究了一下结果还挺有意思,我们可以用升降序相等来帮助理解比较结果. NSString 两个字符串的比较,用 a compare:b 来比,得出的结果 ...

  9. webpack与grunt、gulp的不同

    首先,它们的共同点三者都是前端构建工具,grunt和gulp早期比较流行,现在 webpack 是主流: 区别:grunt 和 gulp 基于 任务和流 : webpack 基于入口文件,webpac ...

  10. 009 Pycharm的使用(各种骚操作和快捷键)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...