【问题标题】:Is it practical to put Python under version control?将 Python 置于版本控制之下是否可行?
【发布时间】:2012-06-23 11:10:33
【问题描述】:

在可行的情况下,我喜欢在版本控制下拥有构建所需的工具。理想的情况是在任何一台机器上都可以运行全新的结帐,并且首先需要安装最少的工具集。

将 Python 置于版本控制之下是否可行?

python 包怎么样?由于对 Docutils 的依赖,我在不安装 Sphinx 的情况下尝试使用它的天真尝试失败了。有没有办法不用安装就可以使用?

【问题讨论】:

标签: python version-control python-sphinx


【解决方案1】:

不,就像编译器一样,python 解释器应该安装在系统范围内。这同样适用于 sphinx 和 docutils 等工具(很可能在通过发行版的包管理器安装 sphinx 时安装)。

这同样适用于大多数 python 包,尤其是那些由应用程序本身使用并通过 PyPi 可用的包。

【讨论】:

    【解决方案2】:

    一般来说,您的版本控制应该包含您的项目。将您的依赖项也包含在其中几乎总是一个坏主意,除非您已做出明确的策略决定始终静态链接它们(对于解释代码,这涉及将它们保留在源代码树中)。听起来你想要的是Zero install,一个启动时依赖注入器。它本质上允许您获得静态链接的好处(如果您不能/不想进入每个相关的包管理器存储库,您的用户不需要安装您的依赖项)而没有缺点(您的用户最终会得到多个可能不同步的常见依赖项版本)。

    【讨论】:

      【解决方案3】:

      与许多应用程序一样,Python 不会在签出项目的任何地方“就地”运行 - 它们需要添加到路径并了解一些设置。这就是为什么它们要么是平台的一部分(Mac 和 Linux),要么需要一个成熟的安装程序(Windows)。

      考虑到这一点,最好不要将 Python 本身包含在存储库中 - 您仍然必须为平台选择正确的二进制安装程序并运行安装程序。然后,如果您更新版本存储库中的版本,则必须升级目标系统。毕竟,您几乎肯定不会拥有一致的系统——因此首先破坏了将 Python 用于版本控制的意义。

      良好的版本控制和依赖管理确实需要保留特定版本的工具。 Setuptools 包含 easy_install,这让这一切变得简单:

      easy_install "pytest==2.2.4"
      

      注意具体版本 - 如果您不太担心具体版本,可以省略,或者您可以指定一个最小值:

      easy_install "pytest>2.2"
      

      (注意:还有其他类似的工具,包括 pip)

      默认情况下,您将从 Pypi 加载,这会将所有历史版本保存在它的存储库中。除非您真的担心某个特定版本会丢失,否则这很好。如果数百万美元或生命危在旦夕,请将该工具签入您的本地存储库并使用 easy_install(或类似工具)进行安装。

      我强烈建议使用virtualenv 项目来虚拟化您的 Python 环境。这样做可以让您创建一个沙箱,easy_install 在其中安装库和工具,从而将您与系统上意外安装的任何其他工具隔离开来。 Virtualenv 还可以管理特定版本的 Python。

      另一个想法:如果复制特定环境用于构建/测试目的是重点,那么考虑使用云/操作系统虚拟化方法,例如 VirtualBox、VMWare 或类似方法。您可以在许多不同的机器上运行完全相同的操作系统映像。

      【讨论】:

        【解决方案4】:

        查看virtualenvbuildout 来满足这些需求。

        virtualenv 可让您将运行项目的 Python 与使用该版本 Python 安装的任何其他软件包隔离开来。因此,如果您的项目需要 Python x.y,则唯一的先决条件是您需要确保系统上存在该 Python 版本的副本。您在virtualenv 中安装的任何软件包都与在其外部安装的软件包完全隔离。

        buildout 允许您指定包依赖项,因此如果您需要sphinx 来构建您的文档,您只需将其包含在您的buildout.cfg 文件中即可:

        parts =
          sphinx
        
        [sphinx]
        recipe = collective.recipe.sphinxbuilder
        

        当您运行 buildout 时,它将安装 collective.recipe.sphinxbuilder,下载并在 virtualenv 中安装 docutilssphinx,然后构建您的文档。

        您的buildout.cfg 可以包含从包含buildout.cfgbootstrap.py 文件的文件夹的初始签出开始运行系统所需的所有依赖项。它使设置系统进行开发或最终部署变得非常容易。

        【讨论】:

        • 如何让用户安装 virtualenv 和 buildout(假设pip install 超出了他们的范围)?
        【解决方案5】:

        是的!

        当您想向非技术用户提供工具而不要求他们安装任何东西时,您可以将 python 放入 scm。从理论上讲,您可以设置一些其他工具并让它们都安装它,这样您就可以确保它们每次同步时都运行pip install -r requirements.txt 并获取所有依赖项,但这并不总是那么容易。如果您在使用 python 时遇到阻力(“它没有编译;每个人都必须安装 python”),那么将 python 放入 scm 是您的最佳选择!

        如果您使用的是 Linux/Unix,您可能会使用内置的包管理器,所以我假设您使用的是 Windows。 (注意:有适用于 Windows 的包管理器,例如 scoop、choco 和 winget——它们值得一看。)

        您有两种选择将 python 放入 scm:

        Windows embeddable package (64-bit)

        why so many python installers 上阅读有关此软件包的更多信息。

        如果你想要最小的 python 并手动提供包(不使用 pip), 这应该是一个好方法。理论上,you can set yourself up to install packages 也。但是,如果您希望团队中的任何开发人员都能够安装软件包, 这可能不是一个好的选择。

        Windows installer (64-bit)

        常规的 python 安装。但我们会做一些不同的事情。

        1. 设置您的 scm 忽略 *.pyc__pycache__
        2. 安装python到C:\python3
        3. 我小心不要运行 python 以避免生成任何临时文件,以便更容易捕获和忽略它们。
        4. C:\python3 复制到您的项目中:c:\proj\tools\python3
        5. C:\python3卸载python
          • 这样您的机器就像您的用户一样。确认一切正常后,您可以将项目中的 python 添加到 PATH 或重新安装 python。
        6. 创建一个目录来保存你的 python 模块:c:\proj\tools\pymodules
        7. 在该文件夹中创建一个空的__init__.py 文件:c:\proj\tools\pymodules\__init__.py
        8. 使用相对路径创建一个 work.pth 文件,以便 python 可以找到您的 python 模块:c:\proj\tools\python3\site-packages\work.pth
            ../../../pymodules
        
        1. 现在提交所有内容。
        2. 运行 python -m http.server 8000 --directory . 或其他一些 python 代码,以便您仔细检查您的忽略是否正确。

        现在您将能够使用 pip 安装新软件包并将它们提交到源代码管理。如果创建pymodules\work\__init__.py(空)和pymodules\work\example.py

        print('Hello from example.py')
        

        你可以运行它:

        c:\proj\tools\python3\python.exe -m work.example
        

        然后导入:

        import work.example
        

        不要弄乱路径!

        但是,您可能需要确保所有用户都直接运行 python.exe 并且不能假定它在他们的 PATH 中。但是,既然您知道它在他们的项目中的位置,那么这不太可能是个问题。您可以创建一键批处理文件,从它们的路径确定 python 的路径:

        %~dp0\..\..\python3\python.exe -m work.example
        

        多年来,我们在工作中一直使用这种设置,最近我在一个新项目中使用上述步骤进行了设置。我们在 svn 中有我们的项目,它运行良好,但是将这么多文件转储到 git 中可能不太理想。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-04
          • 1970-01-01
          • 1970-01-01
          • 2016-03-03
          • 1970-01-01
          • 2014-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多