【问题标题】:Makefile with Django collectstatic to gzip assets; Makefile variable depends on targetMakefile 与 Django collectstatic 到 gzip 资产; Makefile 变量取决于目标
【发布时间】:2013-09-20 12:42:26
【问题描述】:

我正在创建一个 Makefile 来自动化我的 Django 应用程序的“构建”过程。第一步是压缩所有静态 CSS 和 JS 文件。到目前为止,这是我的 Makefile:

CSS_FILES = $(shell find static -type f -name "*.css")
CSS_GZ_FILES = $(CSS_FILES:.css=.css.gz)
JS_FILES = $(shell find static -type f -name "*.js")
JS_GZ_FILES = $(JS_FILES:.js=.js.gz)

all: static $(CSS_GZ_FILES) $(JS_GZ_FILES)

bower_components: bower.json
    bower --config.interactive=false install

static: bower_components
    python manage.py collectstatic --noinput

%.gz: %
    gzip -9 -c -f $< > $@

clean:
    rm -rf bower_components static

如果您不熟悉 Django,静态目标会将一堆 JS 和 CSS(以及更多)文件转储到 static 目录中。

问题,在static目标运行之前无法确定CSS和JS文件的列表。所以第一次运行make,没有文件被压缩。我想要的是collectstatic运行后要重新评估的CSS、JS文件列表。

我曾想过在运行 make 之前运行 collectstatic 来解决这个问题,但 collectstatic 本身取决于不同的 make 规则。

如果有帮助,这个 Makefile 将只使用 GNU Make 运行。

【问题讨论】:

    标签: django makefile gnu-make bower


    【解决方案1】:

    解决此问题的最佳方法是使用自动生成的 makefile。像这样的东西应该可以正常工作;在 makefile 顶部附近添加(在使用 $(CSS_FILES)$(JS_FILES) 之前):

    -include static-output.mk
    

    然后在你的makefile底部附近添加(或者至少,不是作为第一个目标):

    static-output.mk: bower_components
            python manage.py collectstatic --noinput
            @( echo 'CSS_FILES := $$(shell find static -type f -name "*.css")'; \
               echo 'JS_FILES := $$(shell find static -type f -name "*.js")'; ) \
             > $@
    

    并从您的 makefile 中删除 CSS_FILES 和 JS_FILES 的设置并删除“静态”内容。我不太了解“bower_components”的用途或来源,因此无法就此提供建议。

    【讨论】:

    • bower_components 目录包含第三方 JavaScript 包(如 jQuery)。 Bower 引入 JavaScript 库,然后 collectstatic 会将这些 JavaScript 文件复制到静态目录中。在 bower_components 可用之前,静态目标无法运行。
    • 你真的不想让一个 make 目标依赖于一个目录。 Make 根据修改时间做出决定,而目录修改时间的更新规则与文件非常不同。问题是,分别运行这两个命令有用吗?如果在 bower.json 更改时需要同时运行这两个命令,为什么不在同一个配方中同时运行这两个命令?
    • 我创建两个食谱的原因是因为它们创建了两个不同的目录。一个配方创建 bower_components 目录,而另一个创建静态目录。我认为配方是分开的,因为创建了单独的输出。但这又回到了你关于不使用目录作为目标的评论。
    • 对。您不需要将规则绑定到目录。你要问的问题是,只运行其中一个有什么好处吗?如果可以运行 bower 命令,则更改不需要重新运行 bower 命令但确实需要重新运行 collectstatic 命令的内容,然后拆分它们是有意义的,因为在某些情况下可以节省工作。但是如果每次 bower.json 运行都必须同时运行,如果每次运行失败都必须修改 bower.json 来修复它,那么没有理由有两个单独的规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2010-11-23
    • 2014-05-05
    相关资源
    最近更新 更多