将 arara 规则中的 bash shell 脚本调用从版本 4 转换为版本 6

将 arara 规则中的 bash shell 脚本调用从版本 4 转换为版本 6

我在 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);
    }

我在这里做了四件事:

  1. 我重命名该命令name只是为了美观的目的。:)

  2. 我为折叠样式添加了缩进级别。

  3. 我用它们的值替换了大多数参数——这是最好的引用透明度。:)

  4. 因为-cfrombash需要执行的命令(即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"

希望有帮助!:)

相关内容