Scripting 使用gnumake构建脚本

Scripting 使用gnumake构建脚本,scripting,vbscript,makefile,Scripting,Vbscript,Makefile,我有一个脚本(语言是VBScript,但出于问题的考虑,它并不重要),它被用作许多其他脚本的基础——其他脚本称之为“基本脚本”或“包装脚本”。我想将我的存储库模块化,以便这个基本脚本可以与特定脚本实例特有的功能结合起来,然后在两个脚本实例中的任何一个发生变化时重新构建 例如: baseScript.vbs——日志、报告和其他通用功能 queryServerFunctions.vbs——一个脚本,它包含特定的、唯一的任务(函数),这些任务(函数)依赖于baseScript.vbs中的函数 我想

我有一个脚本(语言是VBScript,但出于问题的考虑,它并不重要),它被用作许多其他脚本的基础——其他脚本称之为“基本脚本”或“包装脚本”。我想将我的存储库模块化,以便这个基本脚本可以与特定脚本实例特有的功能结合起来,然后在两个脚本实例中的任何一个发生变化时重新构建

例如:

  • baseScript.vbs
    ——日志、报告和其他通用功能

  • queryServerFunctions.vbs
    ——一个脚本,它包含特定的、唯一的任务(函数),这些任务(函数)依赖于
    baseScript.vbs
    中的函数

我想使用
make
将这两个(或任意数量的带有脚本片段的文件)组合成一个脚本,比如说,
queryServer.vbs
,它是完全独立的。然后,只要源脚本中的任何一个发生更改,就可以通过
make
重新生成此自包含脚本

那么,问题是:我可以使用
make
来管理脚本构建吗?如果可以,那么最好或首选的方法是什么


如果有必要的话,我的脚本环境是在Windows 7 x64上运行的Cygwin。

VBScript和GNU make的结合是不寻常的,因此我怀疑您是否会找到一种“首选方法”来实现这一点。这当然是可能的。以您的示例为例,添加另一个名为
fooServer.vbs
的脚本来展示解决方案如何适用于多个脚本,下面是一个简单的生成文件:

# list all possible outputs here
OUTPUT := queryServer.vbs fooServer.vbs

# tell make that the default action should be to produce all outputs
.PHONY: all
all: $(OUTPUT)

# generic recipe for combining scripts together
$(OUTPUT):
        cat $+ > $@
# note: The first character on the line above should be a tab, not a space

# now we describe the inputs for each output file
queryServer.vbs: baseScript.vbs queryServerFunctions.vbs
fooServer.vbs: baseScript.vbs fooFunctions.vbs
这将根据它们的输入为您创建两个脚本,如果触摸,例如
queryServerFunctions.vbs
,则只会重新生成
queryServer.vbs

为什么要这么麻烦呢

make
的目的是通过比较文件时间戳来判断何时可以安全地跳过构建步骤,从而高效地“重建”内容,因为自上次更新输出文件以来,输入没有更改。假设构建步骤非常昂贵,因此在可能的情况下跳过这些步骤是值得的,而性能提升也值得冒着由于makefile中的错误或误导性的文件时间戳而跳过太多的风险

对于复制一些小文件,我会说一个简单的批处理文件,如

copy /y baseScript.vbs+queryServerFunctions.vbs queryServer.vbs
copy /y baseScript.vbs+fooServerFunctions.vbs fooServer.vbs

更合适。

谢谢您的详细回复。我很好奇
make
是否能够进行比简单的串联更复杂的操作;我知道它主要是为编译语言设计的,但我想知道它是否有可能以比
a.vbs+b.vbs=c.vbs
更复杂的方式交错文件——可能是包含或类似的东西。
make
本身不能做到这一点:它被设计为驱动其他在文件上运行的程序(历史上:C编译器)。在我的示例中,它所驱动的程序是
cat
。您可以用更复杂的东西替换makefile中的
cat
:可能是另一个VBScript,或者,为了最大限度地让人感到奇怪,C预处理器:
cat$+| gcc-E->$@
允许您在输入文件中使用类似
\include
的命令。但是,同样,在如果这些转换不太昂贵,我会坚持使用简单的批处理文件或脚本。