2014-12-13 52 views
4

我想设置一个python包进行分发。我之前没有这样做过,所以我对最佳实践,甚至是如何让事情有效,都很朦胧,而且我遇到了一个问题。我的项目结构如下所示:如何使setuptools遵循符号链接?

ROIWidgets/ 
    MANIFEST.in 
    setup.py 
    setup.cfg 
    ROIWidgets/ 
     __init__.py 
    static/ 
     widgets/ 
      js -> <symlink to folder containing JavaScript files> 

问题在于静态的JS文件。我从distutils开始。我包括这行MANIFEST.in

recursive-include static * 

...并导致被包含在包中的JS。尼斯。然后我读了如果我想让我的安装脚本自动安装依赖项,我需要使用setuptools而不是distutils。所以,我转:我从setuptools导入setup而不是distutils。但是现在,当我说setup.py sdist,该行出现在输出:

warning: no files found matching '*' under directory 'static' 

...和JS文件不包含在分布。经过与调试器长时间的会话后,我找到了问题setuptools/__init__.py。它是:

def findall(dir = os.curdir): 
    """Find all files under 'dir' and return the list of full filenames 
    (relative to 'dir'). 
    """ 
    all_files = [] 
    for base, dirs, files in os.walk(dir): 
     if base==os.curdir or base.startswith(os.curdir+os.sep): 
      base = base[2:] 
     if base: 
      files = [os.path.join(base, f) for f in files] 
     all_files.extend(filter(os.path.isfile, files)) 
    return all_files 

distutils.filelist.findall = findall # fix findall bug in distutils. 

os.walk默认情况下不符合符号链接。所以setuptools版本的findall没有在我的js目录中查找。 distutilsfindall没有使用os.walk - 而是它有自己的目录行走代码。从更新日志看来,distutilsfindall有一个符号链接损坏的问题,该替换旨在解决这个问题。使用os.walk(dir, followlinks=True)本来就很容易,但也许有一些原因为什么这是一个坏主意?

所以我有点卡住了。要么改变我不喜欢的项目结构,要么改变distutilssetuptools的内部结构,这种前景让我更加不快乐。

有什么建议吗?

回答

0

在您的问题发生时,显然这是fixed in the repository(可能过早,因为修复已经变得普遍)。

相关问题是this one

我相信这意味着固定setuptools包的相关版本标记是8.0.2

相关问题