是否有Python的Cake等价物?

时间:2012-07-18 09:32:29

标签: python makefile build-automation

我已经完成了许多“make for Python”项目,但我找不到任何cake file的简单性。我正在寻找的是一个Python等价物,让我:

  1. 将构建命令保存在项目根目录中的单个文件中
  2. 将每个任务定义为一个简单的函数,其中的描述将在没有参数的情况下运行“make”文件时自动显示
  3. 导入我的Python模块
  4. 我正在想象这样的事情:

    from pymake import task, main
    
    @task('reset_tables', 'Drop and recreate all MySQL tables')
    def reset_tables():
        # ...
    
    @task('build_stylus', 'Build the stylus files to public/css/*')
    def build_stylus():
        from myproject import stylus_builder
        # ...
    
    @task('build_cscript', 'Build the coffee-script files to public/js/*')
    def build_cscript():
        # ...
    
    @task('build', 'Build everything buildable')
    def build():
        build_cscript()
        build_stylus()
    
    # etc...
    
    # Function that parses command line args etc...
    main()
    

    我进行了搜索和搜索,但没有发现它。如果它不存在,我会自己做,并可能用它回答这个问题。

    感谢您的帮助!

4 个答案:

答案 0 :(得分:5)

自己构建一个简单的解决方案并不难:

import sys

tasks = {}
def task (f):
    tasks[f.__name__] = f
    return f

def showHelp ():
    print('Available tasks:')
    for name, task in tasks.items():
        print('  {0}: {1}'.format(name, task.__doc__))

def main ():
    if len(sys.argv) < 2 or sys.argv[1] not in tasks:
        showHelp()
        return

    print('Executing task {0}.'.format(sys.argv[1]))
    tasks[sys.argv[1]]()

然后是一个小样本:

from pymake import task, main

@task
def print_foo():
    '''Prints foo'''
    print('foo')

@task
def print_hello_world():
    '''Prints hello world'''
    print('Hello World!')

@task
def print_both():
    '''Prints both'''
    print_foo()
    print_hello_world()

if __name__ == '__main__':
    main()

使用时的样子:

> .\test.py
Available tasks:
  print_hello_world: Prints hello world
  print_foo: Prints foo
  print_both: Prints both
> .\test.py print_hello_world
Executing task print_hello_world.
Hello World!

答案 1 :(得分:4)

您是否考虑过使用fabric

要使用它来实现您的示例,您只需将其添加到名为fabfile.py的文件中:

def reset_tables():
    ''' Drop and recreate all MySQL tables '''
    # ...

def build_stylus():
    ''' Build the stylus files to public/css/ '''
    from myproject import stylus_builder
    # ...

def build_cscript():
    ''' Build the coffee-script files to public/js/* '''
    # ...

def build():
    ''' Build everything buildable '''
    build_cscript()
    build_stylus()

然后你只需要运行fab build来构建。您可以运行fab -l查看可用命令及其说明。

猜猜还值得一提的是,Fabric提供了一些您可能(或可能不会)发现有用的功能。除此之外,它还有一些功能可以帮助您将文件部署到远程服务器,还有一些功能可以让您通过ssh运行远程命令。由于您正在开发基于Web的项目,因此您可能会发现这对于创建部署脚本或类似脚本非常有用。

答案 2 :(得分:2)

有趣的是,有一个名为Cake的Python构建工具,它使用与您的示例几乎相同的语法。见here

答案 3 :(得分:0)

我只是创建一个标准的Makefile,而不是找到特定于语言的东西。在我的一些项目中,make dbmake test等映射到用Python编写的脚本,但可以很容易地使用任何语言,其脚本可以从命令行执行。