【问题标题】:Makefile: Adding a banner to compiled file adds <feff>Makefile:向编译文件添加横幅会添加 <feff>
【发布时间】:2018-12-13 15:45:30
【问题描述】:

我使用 Makefile 进行 Web 开发,我将 scss (sass) 文件编译为 css,并且我想在编译后的文件中添加一个横幅(带有日期、版本、版权信息、git 分支等的标题)。

虽然我终于设法实现了这一点,但当我打开结果时,在加入位置显示&lt;feff&gt;

Makefile 是这样的:

BANNER:=\
    "/**\n"\
    " * @project       $(PROJECT_NAME)\n"\
    " * @author        John Doe <j.doe@example.com>\n"\
    " * @build         $(DATE)\n"\
    " * @copyright     Copyright (c) " $(shell date +%Y) ", <Example Inc.>\n"\
    " */\n"\
    "\n"

css: $(CSS_DEST_DIR)/main.css
    $(call colorecho, 3, $(shell du -h $^))

$(CSS_DEST_DIR)/main.css: $(CSS_SRC_DIR)/main.scss $(CSS_SRC_FILES)
    @mkdir -p $(CSS_DEST_DIR)
    $(call colorecho, 3, "Compiling $@");
    $(eval TMPFILE := $(shell mktemp))
    @-$(SASS_COMPILER) $(SASS_COMPILER_OPTIONS) -o $(TMPFILE) $< 
    @echo $(BANNER) | cat - $(TMPFILE) > $@

结果文件在 vim 中如下所示:

/**
  * @project       data-al
  * @author        Johannes Braun <j.braun@agentur-halma.de>
  * @build         2018-12-13-1619
  * @release       gitRevSync.long() + gitRevSync.branch()
  * @copyright     Copyright (c)  2018 , <HALMA GmbH & Co. KG>
  */


<feff>.button,.button--primary,.cookie-notification__accept,.search-form__submit,.mobnav__trigger,.mobnav__button{padding:0;...

od -a 输出

0000400   nl   <EF>   <BB>   <BF>   .   b   u   t   t   o   n   ,   .   b   u   t

当我在 bash 命令行上执行相同操作时,一切正常。我在 OSX btyw 上。

我怎样才能摆脱这个?感谢您的帮助

【问题讨论】:

  • 这可能来自 sass 编译器,以便将输出标记为 utf8。 (查看临时文件。)
  • tmp文件以efbbbf开头,在vim中不显示
  • Vim 将文件视为 utf-8 编码。它看到 ef bb bf 字节序列,它是 utf-8 的 unicode 字节顺序标记(即 ZERO WIDTH NO-BREAK SPACE),它具有代码点\ufeff。有时 vim 会在显示缓冲区中的数据之前去掉它。请参阅 vim 中的 :help bomb。在这些情况下,od 是一个非常有用的工具。

标签: makefile gnu-make


【解决方案1】:

我强烈建议您转储echo。除了打印简单的字符串后跟换行符之外,它对于任何东西都是不可移植的。例如,\n 不会在所有系统上解析为换行符。相反,请考虑使用printf(程序,而不是函数),它为各种特殊字符和格式化字符串定义良好。

但是,正如 Raymond 所述,这些字符是 UTF-8 BOM (byte order mark)。它们可能是由$(SASS_COMPILER) 生成的;看看是否有防止这种情况发生的选项。

【讨论】:

  • 最好将横幅合并到 sass 输出中,而不是事后尝试将其粘贴。这样,utf8 BOM 将保留在原位,以便正确解释 sass 输出中的字符。
  • @printf "%b" $(BANNER) | cat - $(TMPFILE) &gt; $@ 的行为相同。 Sass 编译器只是 libsass 的一个包装器,我自己编写(用 C 语言)Source code
  • 我想我不够清楚。第一段与您的 BOM 问题没有任何关系。该段是为了回应您在正确输出方面的困难,并指出如果您在其他系统上运行此 makefile 并使用其他 echo 实现,它将不再起作用。
  • 如果您查看TEMPFILE 的内容,它是否包含BOM?它绝对必须。当然,echoprintfcat 中的任何一个都不会插入它。
  • 那么,很明显SASS_COMPILER 程序正在生成这些字符。我不知道那是什么或它是如何工作的,但这个问题与 makefile、make 程序等无关。也许g_file_set_contents 正在添加这些字符。您需要标记此问题以引起相关人员的注意。
【解决方案2】:

在连接之前从头开始剥离 bom。很多选项,但dos2unix 会很好地工作。 (是的,它将保留任何其他 unicode 字符,包括任何嵌入的非中断零宽度空格。)

cp ${BANNER} $@
dos2unix <${TMPFILE} >>$@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    相关资源
    最近更新 更多