【问题标题】:How to deal with a proprietary Python package name conflicting with a public one?如何处理与公共名称冲突的专有 Python 包名称?
【发布时间】:2011-07-07 22:28:10
【问题描述】:

背景

与我一起工作的小组一直在使用和开发一个 Python 包,出于本问题的目的,我将其称为 foobuilder。我们使用为用户提供的私有 RPM 和 Deb 存储库为 Linux 系统提供更新。

最近,PyPi 中添加了一个同名的公共包。它还被打包在公共 Debian 存储库以及其他地方。由于我们不公开宣传我们的包裹,因此弹出同名包裹是可以理解的。

担忧

这对于foobuilder 来说似乎是个大问题,因为在某个地方,用户可能会尝试安装我们的foobuilder,而公共foobuilder 软件包安装在同一系统上。

除了 Python 中的明显问题之外,我猜想将我们的存储库添加到 Debian 包管理器程序也可能会导致一些问题,尽管我还没有尝试过这种情况。

问题

由于我们多年来一直使用专有的foobuilder,因此存在大量代码想要import foobuilder 并希望得到我们的包,所以我认为更改名称是不可行的.

我对可能解决方案的想法

Python

我考虑将包的名称更改为my_foobuilder,并让它包含一个名为foobuilder 的元包,它只包含一个__init__.py,它从my_foobuilder 导入所有内容。我可以指导新用户直接导入my_foobuilder。然后我可以开始弃用foobuilder 名称。最后,这将导致与我现在将 foobuilder 更改为 my_foobuilder 相同的工作量,因为每个人都需要获得更新,并且 foobuilder 名称不能永远处于弃用炼狱中。

Debian

Debian 的问题应该不难解决;我可以将 debian 包名称更改为my_foobuilder,但它仍然安装相同的(冲突的)Python 包。然后我可以使用foobuilder 将my_foobuilder 包设置为Conflict。在过渡期间,它可能需要用户摆弄他们的包管理器才能让事情回到正轨,但我认为这没什么大不了的。尽管如此,这仍会阻止用户同时使用公共 foobuilder 包。

问题

有没有比我上面考虑的更容易或更好的方法来处理这种情况?我正在考虑的解决方案有什么问题吗?你会怎么处理呢?

【问题讨论】:

  • 不是技术解决方案,但您是否考虑过与同名公共包的作者联系,并礼貌地询问他们是否可以使用其他名称。当然,他们有权拒绝,但他们可能会像您一样热衷于避免冲突,而且如果是新软件包,更改会更容易。
  • 我认为您建议的方法正是我会做的。我还将添加一个元包,允许以其他名称导入冲突包(并确保优先导入您的包而不是公共包)

标签: python debian packages naming


【解决方案1】:

我会通过电子邮件发送新的 foobuilder 包作者来讨论这个问题。显然你们中的一个人需要更改包名;由于您的程序的专有性质,可能不希望更改其名称...向新软件包作者提出这个问题可能会提出一些新的解决方案。

确实没有明智的方法让 Python 以某种方式处理此问题,因此“import foobuilder”可能意味着两件事。

【讨论】:

    【解决方案2】:

    我认为只要控制好杂物,在这里使用杂物就可以了。如果我遇到你的情况,我会为你的包创建一个带有其他标识符的文件,例如so.py,并且内容是

    import relative_pathname/foobuilder as my_foobuilder
    

    然后可以明确地将包引用为 so.my_foobuilder,而无需任何团队更改其产品名称。这不是一个很好的解决方案,因为所有内部都需要转移,但它应该解决冲突而不需要更多的修复。

    【讨论】:

      【解决方案3】:

      符号链接?

      $ echo "print 'foo'" > foo.py
      $ ln -s foo.py bar.py
      $ python -c "import foo; import bar"
      foo
      foo
      

      非常简单,虽然有点老套:)

      【讨论】:

      • hmm,虽然这不能解决“import foobuilder”问题,但您可能必须 a) 实际重命名公共包,或 b) 将 PYTHONPATH/sys.path 设置为优先考虑您的包裹。
      猜你喜欢
      • 2015-02-16
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多