在可行的情况下,我喜欢在版本控制下拥有构建所需的工具。理想的情况是,在任何需要首先安装最少工具的机器上运行新的结账。
将Python置于版本控制之下是否可行?
python包怎么样?由于对Docutils的依赖,我在没有安装它的情况下尝试使用Sphinx失败了。有没有办法在不安装的情况下使用它?
答案 0 :(得分:5)
请注意virtualenv和buildout了解这些需求。
virtualenv
允许您将运行项目的Python与使用该版本的Python安装的任何其他软件包隔离开来。因此,如果您的项目需要Python x.y,那么唯一的先决条件是您需要确保系统上有可用的该版本Python的副本。您在virtualenv
中安装的任何软件包都与安装在其外部的软件包完全隔离。
buildout
允许您指定包依赖项,因此如果您需要sphinx
来构建文档,只需将其包含在buildout.cfg
文件中:
parts =
sphinx
[sphinx]
recipe = collective.recipe.sphinxbuilder
当您运行buildout
时,它将安装collective.recipe.sphinxbuilder
,在docutils
内下载并安装sphinx
和virtualenv
,并构建您的文档。
您的buildout.cfg
可以包含从初始签出包含buildout.cfg
和bootstrap.py
文件的文件夹开始运行所需的所有依赖项。它使得开发或最终部署系统变得非常简单。
答案 1 :(得分:4)
不,就像编译器一样,python解释器应该在系统范围内安装。同样的事情也适用于sphinx和docutils等工具(最有可能在通过您的发行版的软件包管理器安装sphinx时安装)。
这同样适用于大多数python包,特别是那些由应用程序本身使用并可通过PyPi获得的包。
答案 2 :(得分:2)
与许多应用程序一样,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。
另一个想法:如果为了构建/测试目的而复制特定环境是重点,那么请考虑使用云/ OS虚拟化方法,如VirtualBox,VMWare或类似方法。您可以在许多不同的计算机上运行完全相同的操作系统映像。
答案 3 :(得分:1)
通常,您的版本控制应包含您的项目。除非你已经做出明确的策略决定总是静态链接(对于解释代码涉及将它们保存在源代码树中),否则在那里包含依赖项几乎总是一个坏主意。听起来你想要的是Zero install,一个启动时依赖注入器。它本质上允许您获得静态链接的好处(如果您不想/不想进入每个相关的包管理器存储库,您的用户不需要安装您的依赖项)没有缺点(您的用户最终得到多个,可能不同步的常见依赖版本。)
答案 4 :(得分:0)
当你想向你的非技术用户交付工具而不要求他们安装任何东西时,你可以将 python 放入 scm。理论上,您可以设置一些其他工具并让他们全部安装它,这样您就可以确保每次同步时它们都运行 pip install -r requirements.txt
并获取所有依赖项,但这并不总是那么容易。如果你在使用 python 时遇到阻力(“它没有编译;每个人都必须安装 python”),那么将 python 放在 scm 中是你的选择!
如果您使用的是 Linux/Unix,您可能会使用内置的包管理器,所以我假设您使用的是 Windows。 (注意:有适用于 Windows 的包管理器,例如 scoop、choco 和 winget——它们值得一看。)
您有两种将 python 放入 scm 的选项:
在 why so many python installers 上阅读有关此软件包的更多信息。
如果你想要最小的python并手动提供包(不使用pip), 这应该是一个好方法。理论上,you can set yourself up to install packages 也。但是,如果您希望团队中的任何开发人员能够安装软件包, 这可能不是一个好的选择。
常规的python安装。但我们会做一些不同的事情。
*.pyc
和 __pycache__
C:\python3
C:\python3
复制到您的项目中:c:\proj\tools\python3
C:\python3
卸载 python
c:\proj\tools\pymodules
__init__.py
文件:c:\proj\tools\pymodules\__init__.py
c:\proj\tools\python3\site-packages\work.pth
../../../pymodules
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 中可能不太理想。