<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Go1.18 on </title>
    <link>https://note.lican.site/tags/go1.18/</link>
    <description>Recent content in Go1.18 on </description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© lican.asia All rights reserved</copyright>
    <lastBuildDate>Sat, 05 Feb 2022 16:00:00 +0800</lastBuildDate>
    <atom:link href="https://note.lican.site/tags/go1.18/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Go1.18 新特性：多 Module 工作区模式</title>
      <link>https://note.lican.site/posts/posts/go/118-module/</link>
      <pubDate>Sat, 05 Feb 2022 16:00:00 +0800</pubDate>
      <guid>https://note.lican.site/posts/posts/go/118-module/</guid>
      <description>&lt;p&gt;大家好，我是煎鱼。&lt;/p&gt;&#xA;&lt;p&gt;Go 的依赖管理，也就是 Go Module。从推出到现在，也已经有了一定的年头了，吐槽一直很多，官方也不断地在进行完善。&lt;/p&gt;&#xA;&lt;p&gt;Go1.18 将会推出一个新特性：Multi-Module Workspaces，用于支持 Module 多工作区，能解决以往的一系列问题。&lt;/p&gt;&#xA;&lt;p&gt;今天将由煎鱼带大家一起深入学习。&lt;/p&gt;&#xA;&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;&#xA;&lt;p&gt;在日常使用 Go 工程时，总会遇到 2 个经典问题，特别的折腾人。&lt;/p&gt;&#xA;&lt;p&gt;如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;依赖本地 replace module。&lt;/li&gt;&#xA;&lt;li&gt;依赖本地未发布的 module。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;replace-module&#34;&gt;replace module&lt;/h3&gt;&#xA;&lt;p&gt;第一个场景：像是平时在 Go 工程中，我们为了解决一些本地依赖，或是定制化代码。会在 go.mod 文件中使用 replace 做替换。&lt;/p&gt;&#xA;&lt;p&gt;如下代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;replace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;golang&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;org&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;net&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Users&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;eddycjy&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;go&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;awesomeProject&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样就可以实现本地开发联调时的准确性。&lt;/p&gt;&#xA;&lt;p&gt;问题就在这里：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;本地路径：所设定的 replace 本质上转换的是本地的路径，也就是每个人都不一样。&lt;/li&gt;&#xA;&lt;li&gt;仓库依赖：文件修改是会上传到 Git 仓库的，不小心传上去了，影响到其他开发同学，又或是每次上传都得重新改回去。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;用户体验非常差，很折腾人。&lt;/p&gt;&#xA;&lt;h3 id=&#34;未发布的-module&#34;&gt;未发布的 module&lt;/h3&gt;&#xA;&lt;p&gt;第二个场景：在做本地的 Go 项目开发时，可能会在本地同时开发多个库（项目库、工具库、第三方库）等。&lt;/p&gt;&#xA;&lt;p&gt;如下代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;github.com/eddycjy/pkgutil&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;pkgutil&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;PrintFish&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果这个时候运行 &lt;code&gt;go run&lt;/code&gt; 或是 &lt;code&gt;go mod tidy&lt;/code&gt;，都不行，会运行失败。&lt;/p&gt;&#xA;&lt;p&gt;报如下类似错误：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fatal: repository &amp;#39;https://github.com/eddycjy/pkgutil/&amp;#39; not found&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个问题报错是因为 &lt;code&gt;github.com/eddycjy/pkgutil&lt;/code&gt; 这个库，在 GitHub 是没有的，自然也就拉取不到。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
