Posts List

Go 版本不一致?别慌,这是特性!

故事的开端:一场“奇葩”的争论 # 最近,我和一位可爱的同事,因为一个项目的 go.mod 文件,产生了一点小小的“学术分歧”。文件长这样: // go.mod go 1.21.1 toolchain go1.22.9 同事认为这种配置“非常奇葩”,并抛出了一个灵魂拷问:“你本地用 go1.22.9 的工具链编译,线上服务器(CI/CD 环境)用的却是 go1.21 的基础镜像来构建,这能不出问题吗?这不就是经典的‘我电脑上好好的’吗?” 说实话,我一开始还没 get 到他说的“线上版本”是啥,后来才明白他指的是我们项目构建镜像所基于的 golang:1.21。他的核心论点是:开发环境和生产环境的 Go 版本不一致,是危险的。 为了说服我,他甚至搬出了“AI 军师”,进行了一场“人机对话”。 AI 的“第一次接触”:危言耸听 # 同事提问: go.mod 中 Go 版本与 Toolchain 版本不一致会带来什么问题? AI 回答(摘要版): 哇,这可不得了!当 go 版本和 toolchain 版本不一致时,会引发一系列灾难性后果: 语言语义和编译行为不一致:编译器优化策略不同,二进制文件体积和性能会有差异。 API 可用性错配:旧工具链编译不了新代码,新工具链用了新 API 在旧环境也跑不起来。 依赖解析差异:go mod tidy 的结果可能不一样,go.sum 文件会在不同开发者之间反复横跳。 构建标志和行为变化:CI/CD 和本地产物的可复现性降低。 安全与合规隐患:你可能会错过新工具链里的重要安全修复。 团队协作噩梦:开发者 A 和 B 构建出的二进制文件性能、大小、告警都不同,定位问题难于上青天。 AI 总结: 为了天下太平,请务必保持版本统一!CI 用什么,你就用什么! 好家伙,这说得头头是道,一套组合拳下来,差点就把我打懵了。如果真如 AI 所说,toolchain 这玩意儿不就成了“潘多拉魔盒”? 我冷静下来,心中升起一个巨大的问号:如果版本不一致是原罪,那 Go 团队费那么大劲引入 toolchain 指令,难道是为了好玩吗?

如何使用 Git 撤消(几乎)任何操作

原文:How to undo (almost) anything with Git 译者:madneal welcome to star my articles-translator, providing you advanced articles translation. Any suggestion, please issue or contact me LICENSE: MIT 任何版本控制系统最有用的功能之一就是能够“撤消”错误。在 Git 中,“撤消”可能意味着许多略有不同的事情。 当你进行新的 commit 时,Git 会及时存储你的仓库在该特定时刻的快照;之后,你可以使用 Git 返回到项目的早期版本。 在这篇文章中,我将介绍一些你可能想要“撤消”所做更改的常见场景,以及使用 Git 执行此操作的最佳方法。 撤销一个“public”修改 # 场景: 你刚刚运行了 git push,将你的修改 push 到 GitHub,现在意识到有一个 commit 有问题。你想把这个 commit 撤销。 撤销: git revert <SHA> 结果: git revert 将创建一个与给定 SHA 相反的新 commit。如果旧 commit 是“matter”,则新 commit 是“anti-matter”——旧 commit 中删除的任何内容都将添加到新 commit 中,而旧 commit 中添加的任何内容都将在新 commit 中删除。

第一款Goland的SCA插件开发之旅

插件开发,是一件即快乐又痛苦的事情。快乐的是你可以根据自己的需求通过插件来进行实现,比如经常看到的 Chrome 的插件开发。插件对于应用的原生生态有着很大的益处,往往那些特别优秀的插件甚至会被官方收编或者在正式功能中加入插件的功能。痛苦的是你需要去看文档,看插件开发的各种文档,如果文档不详细的话,痛苦加倍。程序猿最讨厌的事就是看别人的文档以及自己写文档。当然,除了文档,作为小白你还会踩到各种各样的坑。 先吐槽 # 五一期间,疫情实在是憋得无趣,于是就成生了编写一款 Goland 上的 SCA 检测的插件的想法。Jetbrains 作为一个 IDE 开发公司,通过 Java 的语言生态开发出 IDEA 全家桶系列如此精美并且功能强大的 IDE 产品。其背后的技术能力不得不让人折服。IDE 是程序猿开发的生产力,而 Jetbrains 公司则是生产力的生产力。这几天,笔者就在着力开发一款针对 Goland 的第一款 SCA 检测插件。相较于以往 Chrome 或者 Burp 的插件开发而言,Jetbrains 插件开发的难度大大提升,主要是因为以下几点原因: API 文档过于简单 # IntelliJ 只提供了官方的文档地址。这里面包含了一些 API 的实现以及介绍,但是太简单了。全篇中几乎找不到相关实现的示例代码,通常只有寥寥数语的介绍。举一个例子,希望能够通过插件能够创建文件,在找遍了官方的文档后,只发现了以下内容: 文档里面提到可以使用 PsiDirectory 中的 add 方法来保存 PSI 文件,但它没说 HOW!那怎么办,只能去 Github 中去搜索代码关键字,然后扒别人的代码去看别人是如何实现的,这绝对是一个非常痛苦的过程,尤其是你看的是一个实现很糟糕的插件。 API 复杂性 # 由于 IDEA 强大的生态,其 API 要考虑到兼容性以及很多特性,所以 API 中很多的含义不好理解。其本身也是包含了很多复杂的配置项,同时还需要综合考虑插件是通过什么样的形式去实现。 太“强大的”官方模板 # 官方提供了一个创建插件的模板。首先承认的一点是这个模板的功能非常强大,涵盖插件开发、单元测试、质量检查、发布的整个生命周期,并且与 Github 无缝集成。不过作为模板,它包含的内容是不是太多了呢?这个模板的 README 几乎看了3遍之后才知道里面包含了哪些内容。实际上,对于一个小白来说,这个过程挺痛苦的,甚至可能有的人看了一下就萌发了退意。里面的一些模块,比如单元测试模块以及覆盖率检查这些模块,可以作为可选项,并不一定要默认就包含进去。 Bug 有一点点多 # 目前尚未确定是否这是一个 Bug,但是笔者严重怀疑这是一个 Bug。上面提到的模板,通过 Gradle 实现了一系列的任务。在 Run Verifications 中,有个小任务是 ./gradlew listProductsReleases,它会在 build 文件中生成一个 listProductsReleases.txt 的文件。而这个文件中的版本应该适用于 IDE 兼容型的检查。但是在运行这个 task 的过程中,反复遇到下面的报错:

goland-2022.01版本最新实用功能

在 Go 的开发过程中,经常遇到一个非常麻烦的问题就是 JSON 的解析。因为 Go 中的 JSON 的解析,一般来说需要定义对应 JSON 的 struct。或者使用 interface{} 类型来进行定义,然后再进行类型的转换。当然这在 Python 中可能两三句话就搞定了。 在 Goland 2022.01 最新版本中,终于迎来了在 JSON 方面解析的便捷功能。在最新版本中,只要将 JSON 粘贴到 IDE 中就会提示是否转化为 struct 类型,所有的字段都会被生成,相对于以前的一个个的手动的定义要方便太多太多了。 还可以使用 Action 来进行转换动作,Generate Go Type form JSON: 同时还可以添加新的 tag,key 以及修改 key 的代码风格,调用来说一般使用 alt+enter 快捷键即可。 Intention actions # 字段添加新的 tag 点击 struct 的字段然后按 alt+enter 选择 Add key to tags 修改 key 点击 struct 的字段然后按 alt+enter 选择 Update key value in tags

只要三步,你就可以在github上发布网站了

今天,看到github推送了一个新的消息,Publishing with GitHub Pages, now as easy as 1, 2, 3。总结起来就是在github将你的文档或者发布网页将会变得十分简单。 三步: 创建仓库 提交markdown文件 激活Github pages 现在github对于markdown文件真的支持的特别好,比csdn的markdown好多了。老实说,如果不是github在国内的访问速度感人,我早就把我的博客迁移到github上面去了。csdn的博客简直丑到不能忍了。 反正github的这次更新主要是针对GitHub Pages,这样markodown可以方便快捷的渲染成页面,而且还不会影响你现有的项目或者网站。而且还会给你进行一些默认的配置,对于新手来说,的确是非常友好的。当然了,实在不想用的话,还可以在设置里面禁用掉。更多详细情况,可以去GitHub上面去了解,试试看啊!!!

github命令大全

github是一种开源的版本控制工具,现在已经得到很多人的应用。所以想介绍一下github的一些使用。 github安装 # github提供了桌面客户端,我们也可以通过命令行的方式来进行控制。 windows https://windows.github.com mac https://mac.github.com 配置工具 # 对于本地版本配置用户信息 git config --global user.name "username" git config --global user.email "email" 上面的分别是设置用户名和邮箱 建立版本库 # git init project-name //create a new local repost with the specified name git clone url //download a project and its entire version history 提交变化版本 # git status // list all new of modified files to be committed git diff //show file differences not yet staged git add file //snapshot the file in preparation for versioning git diff --staged //show file difference between staging and the last file version git reset file //unstage the file, but preserve its contents git commit -m "description message" 群组版本控制 # git branch //list all local branches in the current respority git branch branch-name //create a new branch git checkout branch-name //switch to the specific branch and update the working directory git merge branch //combine the specified branch's history into the current branch git branch -d branch-name //delete the specified branch 重构文件名 # git rm [file] //delete the file from the working directory and stage the deletion git rm --cached [file] //remove the file from version control but pressure the file locally git mv [file-origin] [file-renamed] //change the file name and prepare it for commit 排除版本控制 # *.log build/ temp-* 以.log为结尾的文件都不会被进行版本控制

微软Visual Studio Code基本特征

Visual Studio Code它的核心功能还是作为一个代码编辑器。和其他的代码编辑器一样,VScode采取通用的UI和布局,浏览器在左边,显示所有的文件和文件夹,右边你打开的文件的编辑页面。 文件,文件夹以及项目 # VScode是基于文件和文件夹的,你可以立即开始通过打开一个文件和文件夹。除了这些,VScode能够读不同框架和平台定义的项目文件。比如,如果你打开的文件夹包含一个或者多个package.json,project.json,tsconfig.json,或者ASP.NET 解决方案和项目文件,VScode可以读取这些文件并且利用他们来提供额外的功能比如代码补全功能。 打开VScode # 你可以从命令行利用VScode打开文件,文件夹或者项目。 打开VScode中的一个index.html文件: code index.html 打开文件夹c:\src\Contents: code c:\src\contents VScode中并不区分是打开文件夹还是打开项目。如果你打开的文件夹包含项目文件,VScode会读取这些文件并且显示这些项目内容在状态栏中。在这你也可以进行不同的项目之间的切换。 打开文件夹c:src\WebApp中包含的项目: code c:\src\webapp 换句话说,打开包含项目的文件夹能够有效地打开项目: 打开当前文件夹: code . 基本布局 # VScode布局简单,能够最大化编辑界面并且也能够留下足够的空间浏览文件夹或者项目的内容。UI可以分成四个部分 编辑器 最主要地区域编辑文件。最多可以打开三个编辑页面。 边栏 包括不同的视图,比如你在处理项目时候地浏览器 状态栏 显示你正在打开项目和文件的状态 视图栏 可以让你在不同的视图中进行切换 每次你打开VScode都会恢复到上一次关闭的状态。文件夹布局如下所示。 不是把文件放在不同的tab之中,VScode可以最多同时打开3个编辑器。 并排编辑 # 你可以最多可以并排打开3个编辑器。 如果你已经有一个编辑器打开,你可以通过各种不同的途径打开另外的编辑器。 Ctrl 在浏览器中打开一个文件 comman+\ 将编辑器分成两个 无论何时你打开另外一个文件,编辑器将会激活正在打开的文件。

初识NuGet

因为想查一查opencvsharp的东西,然后发觉这个包可以再NuGet上面可以直接下载。我也经常在很多地方都可以看到NuGet,所以我想写下来,记录下来。 NuGet是一个免费的并且开源的包管理器在微软的开发平台上。NuGet发布在Visual Studio的拓展插件上。 NuGet现在已经移植到代码管理平台github了,链接地址为https://github.com/nuget/home。他们打算以后新的东西都在这个网址更新了。 资源 # NuGet Gallery: http://nuget.org Documentation: http://docs.nuget.org Blog: http://blog.nuget.org Twitter: @nuget JabbR chat: https://jabbr.net/#rooms/nuget TeamCity continuous build server: http://build.nuget.org Latest successful VS Extension build: http://build.nuget.org/NuGet.Tools.vsix Latest successful NuGet.exe build: http://build.nuget.org/NuGet.exe NuGet貌似自从vs2012版本之后就默认在系统中了,所以不需要再安装了。如果想确保你的版本有没有安装NuGet,你可以看一下工具栏。你也可以在扩展和更新中可以进行NuGet的更新和管理。 只要你安装了,就可以非常方便的引用第三方的库,直接在引用里面添加就可以了。