【问题标题】:Python library to access the Closure Compiler Service API用于访问 Closure Compiler Service API 的 Python 库
【发布时间】:2013-10-05 18:12:05
【问题描述】:

我正在尝试将闭包编译器集成到我的部署过程中。我遇到了this online tool,它允许我从所需的组件生成一些 javascript。我看到可以通过API 访问该工具,所以我想将它集成到我的部署脚本中。

我不想重新发明轮子,我想知道是否有可用的 Python 包装器用于此 API。提供的examples 级别很低,我还没有找到替代方案。

有人可以指向更高级别的 python 库来访问Goggle Closure Compiler Service API吗?

【问题讨论】:

    标签: python google-closure-compiler


    【解决方案1】:

    developer.google.com 的示例实际上使用 Python,所以这是一个很好的起点。 但是,API 似乎太小了,以至于官方文档也只是选择使用urllibhttplib Python 内置模块。将该逻辑推广到一个或两个辅助函数中似乎是一项微不足道的任务。

    ...
    
    params = urllib.urlencode([
        ('js_code', sys.argv[1]),
        ('compilation_level', 'WHITESPACE_ONLY'),
        ('output_format', 'text'),
        ('output_info', 'compiled_code'),
      ])
    
    # Always use the following value for the Content-type header.
    headers = {"Content-type": "application/x-www-form-urlencoded"}
    conn = httplib.HTTPConnection('closure-compiler.appspot.com')
    conn.request('POST', '/compile', params, headers)
    
    ...
    

    https://developers.google.com/closure/compiler/docs/api-tutorial1

    P.S.您还可以查看https://github.com/danielfm/closure-compiler-cli——它是一个命令行工具,但源代码展示了 API 的真正简单性。

    所以把上面的变成 Pythonic API:

    import httplib
    import sys
    import urllib
    from contextlib import closing
    
    
    def call_closure_api(**kwargs):
        with closing(httplib.HTTPConnection('closure-compiler.appspot.com')) as conn:
            conn.request(
                'POST', '/compile',
                urllib.urlencode(kwargs.items()),
                headers={"Content-type": "application/x-www-form-urlencoded"}
            )
            return conn.getresponse().read()
    
    
    call_closure_api(
        js_code=sys.argv[1],
        # feel free to introduce named constants for these
        compilation_level='WHITESPACE_ONLY',
        output_format='text',
        output_info='compiled_code'
    )
    

    【讨论】:

    • 太好了,谢谢!你在一分钟内完成了我计划今天晚些时候做的事情 - 希望我需要两分钟!
    • 只是为了让您知道,我根据您的代码创建了this gist
    • @gonvaled:!!我完全不赞成无缘无故地使用课程!如果您的模块被命名,例如closureapi,您可以只使用import closureapi 并将其用作对象:closureapi.call_closure_api()
    • 我明白了。除了风格问题,使用类有什么缺点吗?你有任何与此相关的链接吗?对我来说,它更清楚,我可以扩展类以在将来添加一些状态以防万一。例如,我可以通过向类添加适当的状态来获得optimizer = ClosureCompiler(compilation_level=ADVANCED_OPTIMIZATIONS_CL)
    • 您有 C# 或 Java 背景吗?因为我看不出它如何使任何事情变得更清晰;事实上,恰恰相反:它使它看起来好像在某处可能存在实例化,或者实例状态或某种东西。如果您必须使用单例,至少通过例如使其成为真正的单例。 MyObj = MyObj()class MyObj(object): 定义之后。 (另外,如果您使用的是 2.x,请确保从 object 继承,以免获得旧式类)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多