假设我们有两个顶级流和一个流组件:
# program/prb1.rb
Flow.create interface: 'MyApp::Interface', temperature: 25 do
import 'components/ram'
end
# program/prb2.rb
Flow.create interface: 'MyApp::Interface', temperature: 125 do
import 'components/ram'
end
# program/components/_ram.rb
Flow.create do |options|
end
而这个界面:
module MyApp
class Interface
include OrigenTesters::ProgramGenerators
def initialize(options = {})
puts "New interface!"
puts "The temperature is: #{options[:temperature]}"
super
end
end
end
然后,如果我们通过在程序目录上运行 prog gen 来生成两个流origen p program,那么我们会看到接口被实例化了两次,每个顶级流一次:
$ origen p program
[INFO] 0.006[0.006] || **********************************************************************
[INFO] 0.010[0.004] || Generating... prb1.rb
New interface!
The temperature is: 25
[INFO] 0.024[0.014] || Generating... prb2.rb
New interface!
The temperature is: 125
[INFO] 0.052[0.028] || Writing... prb1.tf
[INFO] 0.053[0.001] || *** NEW FILE *** To save it: cp output/testflow/mfh.testflow.group/prb1.tf .ref/prb1.tf
[INFO] 0.054[0.000] || **********************************************************************
[INFO] 0.058[0.004] || Writing... prb2.tf
[INFO] 0.059[0.001] || *** NEW FILE *** To save it: cp output/testflow/mfh.testflow.group/prb2.tf .ref/prb2.tf
[INFO] 0.059[0.000] || **********************************************************************
Referenced pattern list written to: list/referenced.list
[INFO] 0.061[0.002] || *** NEW FILE *** To save it: cp list/referenced.list .ref/referenced.list
[INFO] 0.061[0.000] || **********************************************************************
因此,从输出中我们可以看到创建了接口的两个实例,每个生成的顶级流一个,传递给的选项Pattern.create被传递到接口的初始化方法。
请注意,当顶级流导入子流/组件时,不会实例化新接口。
原来,每次Flow.create遇到都会创建一个新的接口实例,也就是重新加载目标的时间。我们这样做是因为我们在早期实现中看到了目标在整个流程中持续存在的问题。这导致一些流生成顺序依赖性开始蔓延到某些应用程序中,例如,当您独立生成 prb1.rb 与与其他流同时生成它时,prb1.rb 的输出是不同的。因此,通过每次都从头开始,它消除了根据您的目标之前所做的事情而无意更改流输出的可能性。
但最终,我们发现在生成完整的顶级流的上下文中,我们确实需要一些持久状态来用于跟踪测试编号等事情。所以为了妥协,我们保持目标刷新每一次Flow.create,但只有在遇到新的顶级时才刷新界面Flow.create。
到目前为止,这在实践中运行良好。但是,如果您觉得您需要一个为整个 Origen 程序生成命令持续存在的接口,那么您可能遇到了我们没有设想到的用例,或者可能有另一种方法可以实现您想要实现的目标.
如果需要,请打开另一个问题以提供更多详细信息。