快速开始

创建工作区

写一个最简单的基础项目实际演练一下 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. 为何不要随便用from xx import *

    新单位,新工作,远程办公,你想想有多麻烦吧. 一块块看每个模块的详细功能. 看到一个函数,返回值也是一个函数,这本来没啥难的,但是文件里只出现一次.怎么都找不到来自哪个文件,后来全项目搜才找到,原来来 ...

  2. python学习教材选哪个

    python语言俨然成为当今最流行的国际语言,无论你是做AI的还是非AI,大家都在用python语言,各种平台也都开始支持python,现在连文科生都在学习python语言了,甚至很多表哥表姐的工作都 ...

  3. 小tips:...运算符(展开运算符、剩余操作符)

    如下例子: 1. var set = new Set([1, 2, 3, 4, 4,4,4,4,2,2,2]) set=[...set] 2. let [head, ...tail] = [1, 2, ...

  4. CSS – Monospaced font & ch unit 等宽字体与 ch 单位

    前言 在做 Statistics Counter 时, 发现总是会跳, 研究后才发现原来是等宽搞的鬼, 这篇就来说说等宽字体. 参考 等宽字体在web布局中应用以及CSS3 ch单位嘿嘿 不等宽字体 ...

  5. Figma 学习笔记 – Constraints 约束

    用途 Constraints 用于 responsive design, 子元素和父元素建立约束关系后, 当父元素 dimension 变换的时候, 子元素会做出相应的变化 (移动位置或 resize ...

  6. .NET 的 Native AOT 现在是什么样的?

    今天要写的这篇文章源自昨天在朋友圈发的文章<UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化>[1],一位小伙伴的对话让我想全面梳理下Native AO ...

  7. 【赵渝强老师】Docker Swarm集群的数据持久化

    如果Docker Swarm集群中运行了mysql.nginx等服务,这些服务的数据如果没有挂载到宿主机中,那么容器一旦停止运行,那就意味着数据丢失. 有什么方法可以解决swarm集群中运行的服务能够 ...

  8. 从0到1搭建权限管理系统系列四 .net8 中Autofac的使用(附源码)

    说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...

  9. Android Systrace 基础知识 -- 分析 Systrace 预备知识

    1. 正文 1.1 线程状态查看 Systrace 会用不同的颜色来标识不同的线程状态, 在每个方法上面都会有对应的线程状态来标识目前线程所处的状态,通过查看线程状态我们可以知道目前的瓶颈是什么, 是 ...

  10. Kulla-Conty BRDF补充_重要性采样GGX

    重要性采样的方法有多种,这里我们介绍其中一种,你的实现也可以使用其他方法.我们将通过 GGX 采样来完成 E(µ)的预计算工作.先从理论上讨论 GGX 采样算法,对于给定出射方向 o 的 GGX采样, ...