我在 arara 4 中有一个以下规则,它调用 bash shell 并在该 shell 中执行命令:
!config
identifier: OCbootstrap
name: OCbootstrap
commands:
- <arara> bash -i -c OCbootstrap @{build}
arguments:
- identifier: build
flag: <arara> @{parameters.build}
default: "Build"
我在将其转换为 arara 6 时遇到了一些问题...下面的版本给了我以下错误:“java.util.NoSuchElementException:没有值存在”但是没有行信息所以我真的不知道哪里出了问题...
!config
identifier: OCbootstrap
name: OCbootstrap
authors:
- Marc De Graef
commands:
- name: execOCbootstrap
command: >
@{
return getCommand(shell, args, OCb, build)
}
arguments:
- identifier: shell
flag: 'bash'
default: 'bash'
- identifier: args
flag: '-i -c'
default: '-i -c'
- identifier: OCb
flag: 'OCbootstrap'
default: 'OCbootstrap'
- identifier: build
flag: >
@{
parameters.build
}
default: "Build"
任何的意见都将会有帮助!
谢谢,马克。
答案1
马克,你很近获得完美规则!:)
恭喜!
如果可以的话,我会借此机会评论您的规则:
!config
identifier: OCbootstrap
name: OCbootstrap
authors:
- Marc De Graef
到目前为止,我们已经做得很好了!:)
commands:
- name: execOCbootstrap
太好了,我们在列表中有了第一个命令(顺便说一下,它是唯一的命令)。
command: >
@{
return getCommand(shell, args, OCb, build)
}
遗憾的是,这行不通,原因是 YAML 在使用折叠样式时需要缩进级别。我们需要在与相关的每行开头添加至少一个空格command
。此外,由于-c
需要包含要执行的命令的字符串,我们可能需要进行更新。
arguments:
- identifier: shell
flag: 'bash'
default: 'bash'
这绝对没有错,但我个人认为我们可以删除它并通过用其值替换变量来保存一个参数处理,因为它肯定是常量(我们这里没有发生任何扩展)。
- identifier: args
flag: '-i -c'
default: '-i -c'
上面的评论同样适用于此,但我想补充一点'-i -c'
可能导致脚本出现意外行为。原因是,实际上我们有两个标志 —-i
和-c
— 而不是一个 —-i -c
表示。解决这个问题的方法是替换'-i -c'
为[ '-i', '-c' ]
,它是两个字符串的列表(在本例中为两个标志)。
- identifier: OCb
flag: 'OCbootstrap'
default: 'OCbootstrap'
我会使用常量值而不是参数。理由与其他条目相同。:)
- identifier: build
flag: >
@{
parameters.build
}
default: "Build"
除了使用折叠样式时的缩进问题外,一切都很好。只需在与相关的每行开头添加至少一个空格即可flag
。
就是这样。:)
以下是我的小建议:
!config
identifier: OCbootstrap
name: OCbootstrap
authors:
- Marc De Graef
commands:
没什么新鲜事。:)
- name: Executing OCbootstrap
command: >
@{
call = 'OCbootstrap ' + build[0];
return getCommand('bash', '-i', '-c', call);
}
我在这里做了四件事:
我重命名该命令
name
只是为了美观的目的。:)
我为折叠样式添加了缩进级别。
我用它们的值替换了大多数参数——这是最好的引用透明度。
:)
因为
-c
frombash
需要执行的命令(即OCbootstrap
)及其潜在参数(即 所保存的值build
)作为带引号的字符串,这对我们来说意味着我们有一个参数,所以我创建了一个新的局部变量,call
并将其命名为命令OCbootstrap
+ 一个空格(字符串构建,因此需要它)+ 的第一个值build
(值得一提的是,我们将值规范化为字符串列表,因此从build
技术上讲是[ 'Build' ]
,而不是像人们想象的那样),然后我们将它作为单个参数'Build'
传递给方法。执行后,我们将得到以下结果:getCommand(...)
[DR] (OCbootstrap) Executing OCbootstrap ----------------------------------------------------------------- Author: Marc De Graef About to run: [bash, -i, -c, OCbootstrap Build] @ /home/paulo
看看OCbootstrap Build
现在它本身是如何成为一个论点的。:)
arguments:
- identifier: build
flag: >
@{
parameters.build
}
default: "Build"
然后我们只剩下一个参数,我只是为与之相关的每一行添加了一个缩进级别flag
。
新规则:
!config
identifier: OCbootstrap
name: OCbootstrap
authors:
- Marc De Graef
commands:
- name: Executing OCbootstrap
command: >
@{
call = 'OCbootstrap ' + build[0];
return getCommand('bash', '-i', '-c', call);
}
arguments:
- identifier: build
flag: >
@{
parameters.build
}
default: "Build"
希望有帮助!:)