我正在构建一个裤子插件,该插件应修改python_binary目标中“源”规范中的代码,以使标头中包含一些额外的代码。我不知道如何创建裤子/将裤子重定向到中间文件。
我这样做的原因是,据我所知,裤子构建不支持.pth文件的概念。我认为不支持它很好,但是我们正在从一个确实使用.pth的基于setuptools的项目中迁移到裤子构建,因此必须修改sys.path以支持正确的路径(将磁盘的实际路径固定为有问题的库是不可能的,因为第三方工具会为我们生成库的代码和布局。
给出下面的代码,MyPythonBinary尝试更改源代码以在文件的开头包括几行额外的代码。问题是“源”正在引用实际的源文件,但是我想写一个带有更改的中间文件,然后将“源”重定向到该中间文件。
我知道“ sources”是FilesetWithSpec的一种,但是想出如何正确创建它们的方法有点困难,因此我可以写一个不同的中间文件。有人可以帮我吗?
from pants.backend.python.targets.python_binary import PythonBinary
from six import string_types
import os
PATCH_CODE = """
import MyOtherLibrary
if os.path.dirname(MyOtherLibrary.__file__) not in sys.path:
sys.path.append(os.path.dirname(MyOtherLibrary.__file__))
"""
class MyPythonBinary(PythonBinary):
def __init__(self, *args, **kwargs):
if 'sources' in kwargs:
sources = kwargs['sources']
assert len(sources.files) == 1,\
"sources.files must contain a single file"
# I know this is nasty. I got it from debugging.
source_file = sources.snapshot.path_stats[0].stat.path
self._patch_source(source_file, PATCH_CODE)
# recreate the filespec but pointing to an intermediate file
# kwargs['sources'] = None
super(MyPythonBinary, self).__init__(*args, **kwargs)
def _patch_source(self, source_file, prepend=""):
"""
Patches source code in C{source_file} with the contents of C{prepend},
storing the results in a temporary source file.
@type source_file: string_types
@param source_file: path to the file containing the source code
@type prepend: string_types
@param prepend: Code to prepend
"""
assert isinstance(source_file, string_types)
assert isinstance(prepend, string_types)
with open(source_file, 'w+') as fout:
fout.seek(0)
fout.write(prepend)
以上代码将PATCH_CODE中的代码添加到原始源文件中,而不是中间文件中。裤子不知道新的中间文件。