包含一个文件到另一个文件

时间:2009-12-29 17:07:09

标签: regex bash shell sed preprocessor

我正在寻找用于构建JS文件的非常简单的模板脚本。它应该只做一件事:将一个文件包含在另一个文件中。

模板(main.js)

/*> script.js */

var style = "/*> style.css */";

的script.js

var my_script;

的style.css

html, body {margin:0; padding:0}
.my-style {background: #fffacc}

输出

var my_script;

var style = "html, body {margin:0; padding:0}\
.my-style {background: #fffacc}";

我做了cat main.js | sed -e 's!/\*> \(.*\) \*/!cat \1!g'。它的输出:

cat script.js

var style = "cat style.css";

make cat \1如何实际运作?

我将用它来构建UserJS(Greasemonkey脚本)。我的存储库中的JS和CSS文件很少。我想让它们彼此分开。但结果脚本必须只有一个,所以我需要将所有JS和CSS文件合并到它。

我可以使用sed,awk,perl或ruby。


最后,我做了js-preprocessor。谢谢你们!

3 个答案:

答案 0 :(得分:4)

有三个明显的解决方案:

  1. 不要使用任何类型的include指令,只需指定文件的顺序。这允许您使用简单的cat file1 file2 file3 > output语句来获得最终结果。
  2. 使用现有的预处理器,例如C预处理器(cpp),但要小心它可能与JS交互的方式。但是,您也可以通过在“标题”中定义宏来使用它,就像已经为C创建的那样,创建自己的库。
  3. 编写一个可以完全按照您的需要执行的简单预处理器。如果你只是想支持#include-like指令,那就不难了。
  4. 非显而易见的解决方案可能会使用某些特定的JavaScript引擎,它允许您添加挂钩或插件以支持文件包含,输出生成的代码,或者完全不同的其他内容。

答案 1 :(得分:1)

这个用途是什么? JavaScript不支持多行字符串,因此在模板扩展后,style变量定义将导致语法错误。

编辑:我的错误 - 我错过了您的示例扩展包含\延续。这使扩展过程变得复杂;如果你能详细了解你计划在哪里使用它,你有哪些工具等,那将是一件好事。

Ruby中的一个例子:

ruby <main.js -pe'$_.gsub!(%r{/\*>\s*(.+?)\s*\*/}) { File.read($1) }'

答案 2 :(得分:0)

我也会使用ruby,但我建议依赖ruby stdlib中包含的erb。如果要添加更复杂的功能,它允许扩展。

在您的情况下,您可以编写以下方法:

def include_file(filename)
  File.open( filename, "r" ) { |f| f.read }
end

然后从你的模板中使用它:

<% include_file "script.js"  %>
var style = "<% include_file "style.css"  %>";

它只是有效......