jjzjj

go - 如何处理 go import 绝对路径和 github fork ?

coder 2023-06-26 原文

围绕这个有很多问题,包括为什么你不应该使用 import "./my/path" 以及为什么它只工作因为一些遗留的 go 代码需要它。

如果这是正确的,你如何处理项目的封装和扩展 github 分支?在每一个其他语言中,我可以做一个项目的 github 分支,或者 git clone,所有的东西都封装在那里。如何从 go 项目中获得相同的行为?

使用 go "hello world"示例的简单示例。

你好.go

package main

import ("fmt"
    "github.com/golang/examples/stringutil")

func main() {
    fmt.Printf(stringutil.Reverse("hello, world")+"\n")
}

上面的效果很好。但是,如果我想使用我自己的 stringutil,它位于一个子目录中并将编译为单个二进制文件,我仍然需要完整路径:

package main

import ("fmt"
    "github.com/myrepo/examples/util/stringutil")

func main() {
    fmt.Printf(stringutil.Reverse("hello, world")+"\n")
}

现在,如果有人复制或 fork 我的 repo,它会直接依赖于“github.com/myrepo/”,即使它完全在内部使用!

如果有 20 个不同的文件导入 utils/ 怎么办?每次有人 fork 时我都需要改变吗?这是很多无关的更改和无意义的 git 提交。

我在这里错过了什么?为什么相对路径这么糟糕?如何在不更改数十个文件的情况下 fork 引用其自己的子目录(及其包)的项目?

最佳答案

至于不允许相对导入背后的原因,您可以从某种角度阅读此讨论:https://groups.google.com/forum/#!msg/golang-nuts/n9d8RzVnadk/07f9RDlwLsYJ

我个人宁愿启用它们,至少对于内部导入,正是出于您所描述的原因。

现在,如何处理这种情况?

  1. 如果您的复刻只是来自另一个项目的一个小修复,可能很快就会被接受为 PR - 只需手动编辑 git Remote ,使其引用您自己的 git 存储库,而不是原始的。如果您使用的是像 godep 这样的 vendor 解决方案,它会很顺利地工作,因为保存它只会供应您的 fork 代码,并且永远不会直接使用 go get

  2. 如果您的 fork 是一个很大的变化并且您打算保持 fork ,请重写所有导入路径。您可以使用 sed 将其自动化,或者您可以使用支持重写正在格式化的代码的 gofmt -r

[编辑] 我还找到了这个旨在帮助解决这种情况的工具:https://github.com/rogpeppe/govers

我已经完成了 1 和 2 - 当我刚刚对某个库进行了一个小错误修复时,我只是更改了 Remote 并将其更新。当我实际上 fork 了一个库而不打算将我的更改合并回来时,我更改了所有导入路径并继续仅使用我的存储库。

我还可以考虑添加一个 vendor 工具来实现这些东西的自动化,但我认为目前没有任何工具支持它。

关于go - 如何处理 go import 绝对路径和 github fork ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32166642/

有关go - 如何处理 go import 绝对路径和 github fork ?的更多相关文章

  1. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

  2. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  3. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  4. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

    我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

  5. Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题? - 2

    假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案

  6. ruby-on-rails - 如何播种图像的路径? - 2

    Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i

  7. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  8. ruby-on-rails - 我如何处理 View 中的 nils? - 2

    我设置了以下模型:classContact:no_freq?validates_presence_of:freq,:if=>:no_band?protecteddefno_freq?freq.nil?enddefno_band?band.nil?endendclassBand当我在我的新View中输入频率时,如果输入了频率,则不允许指定波段。这在我的其他观点中造成了问题,因为band现在为零。我如何允许不指定band并在我的index和showView中显示为空,然后在editView中允许在以后指定一个。通过执行以下操作,我已经能够让我的索引显示空白:contact.band&&co

  9. 对象的 Ruby 方法查找路径 - 2

    是否有内置的Ruby方法或众所周知的库可以返回对象的整个方法查找链?Ruby查看一系列令人困惑的类(如thisquestion中所讨论)以查找与消息对应的实例方法,如果没有类响应消息,则调用接收方的method_missing。我将以下代码放在一起,但我确信它遗漏了某些情况或者它是否100%正确。请指出任何缺陷并指导我找到一些更好的代码(如果存在)。defmethod_lookup_chain(obj,result=[obj.singleton_class])ifobj.instance_of?Classreturnadd_modules(result)ifresult.last==B

  10. ruby-on-rails - rails 中的路径解析 - 2

    我正在寻找这样解析路由路径的方法:ActionController::Routing.new("post_path").parse#=>{:controller=>"posts",:action=>"index"}应该和url_for相反更新我发现:Whatistheoppositeofurl_forinRails?Afunctionthattakesapathandgeneratestheinterpretedroute?ActionController::Routing::Routes.recognize_path("/posts")所以现在我需要将posts_path转换为“/p

随机推荐