代码管理:生成具有各种规则的细微变化的源文件
问题描述:
我有一个声明性语言(twolc
,实际上)的源文件,我需要编写许多变体:规范版本和许多非规范版本,每个来自标准的一个或多个变体。例如,假设规范性文件有三个规则:代码管理:生成具有各种规则的细微变化的源文件
Rule A:
Do something A-ish
Rule B:
Do something B-ish
Rule C:
Do something C-ish
然后一个变体可能有相同的规则为准则的A
和C
,但B
不同的规则,我会打电话给B-1
:
Rule A:
Do something A-ish
Rule B-1:
Do something B-ish, but with a flourish
Rule C:
Do something C-ish
想象一下,在许多不同的规则上你有许多不同的微妙变化,你有我的情况。我担心的问题是代码可维护性。如果稍后我决定Rule A
需要以某种方式重构,那么我将有50多个文件需要手动编辑完全相同的规则。
我的想法是有单独的文件中每一条规则,并将它们连接成使用cat
变化:cat A.twolc B-1.twolc C.twolc > not-norm.twolc
cat A.twolc B.twolc C.twolc > norm.twolc
,等
是否有专门用来管理这类问题的任何工具?有没有比我想到的更好的方法?我提出的解决方案是否存在我应该留意的弱点?
答
当你添加的makefile文件标签,这里是一家制造基于GNU(只有GNU的make)解决方案:
# Edit this
RULES := A B B-1 C
VARIATIONS := norm not-norm
norm-rules := A B C
not-norm-rules := A B-1 C
# Do not edit below this line
VARIATIONSTWOLC := $(patsubst %,%.twolc,$(VARIATIONS))
all: $(VARIATIONSTWOLC)
define GEN_rules
$(1).twolc: $$(patsubst %,%.twolc,$$($(1)-rules))
cat $$^ > [email protected]
endef
$(foreach v,$(VARIATIONS),$(eval $(call GEN_rules,$(v))))
clean:
rm -f $(VARIATIONSTWOLC)
patsubst
很简单。 foreach-eval-call
有点棘手。长话短说:它遍及所有变化(foreach
)。对于每个变体v
,它通过将$(1)
替换为$(v)
(当前变体)和$$
通过$
扩大(call
)GEN_rules
。然后将每个展开结果实例化(eval
)作为正常制作规则。例如:v=norm
,所述GEN_rules
膨胀产生:
norm.twolc: $(patsubst %,%.twolc,$(norm-rules))
cat $^ > [email protected]
其又扩展为(一步工序):
步骤1:
norm.twolc: $(patsubst %,%.twolc,A B C)
cat $^ > [email protected]
第二步:
norm.twolc: A.twolc B.twolc C.twolc
cat $^ > [email protected]
step3:
norm.twolc: A.twolc B.twolc C.twolc
cat A.twolc B.twolc C.twolc > norm.twolc
这你想要做什么:如果norm.twolc
不存在或是否有任何A.twolc
,B.twolc
,C.twolc
比norm.twolc
更近,被执行的配方。
我尝试过在网上搜索,但这似乎是不知道正确的术语是封锁的那些时代之一。 – reynoldsnlp