2016-03-06 59 views
1

我为Ruby版本管理器chruby编写了一个模块。这适用于Puppet v3,但我刚开始使用Puppet v4,并且$version参数不会在$source_url字符串中插入。依赖其他参数的默认参数

class chruby(
    $version, 
    $source_url = "https://github.com/postmodern/chruby/archive/v${version}.tar.gz", 
) { 

我总是想一个版本过去了,我可能需要一个源传递的url,虽然平时没有 - 已规则改变了,这是不再允许,我怎么能得到这个与v4的工作吗?我试过这个:

unless $source_url { 
    $source_url = "https://github.com/postmodern/chruby/archive/v${version}.tar.gz" 
    } 

在类体中,但它也不插入。我检查了$version使用notice。我找不到如何从文档做到这一点:

我一直在使用Hiera一些事情开始并理解本可以不需要用默认值,但是我上周刚刚开始使用它,所以我现在还不清楚,但仍然想明白为什么这已从v3更改为v4。

任何帮助或见解将不胜感激。

+0

它从未在木偶可靠地工作,以引用的另一个的默认值,其中,“可靠”意味着能够预测是否一类的值或限定的类型的参数它会在给定类的给定版本的第一次尝试之前工作。不要这样做。如果它在你之前似乎为你工作,那么你就是幸运的。只有两个类参数,你有50%的机会。如果升级时停止工作,那么你的运气失败了。 –

+0

为了公平对我来说,它使用Puppet 3的多个参数对我来说可靠地工作了几年,而且我从其他人那里得到了它(我不记得在哪里),所以我会责备他们。为了公平对待Puppetlabs,[他们重新编写了解析器,使其更严格并且表示这是一个突破性更改](https://docs.puppetlabs.com/puppet/4.0/reference/release_notes.html#break-next-version-of -puppet-language),所以我不会呻吟。很多:) – iain

回答

2

使用另一个变量:

class chruby(
    $version, 
    $source_url = undef, 
) { 
    $actual_source_url = $source_url ? { 
    undef => "https://github.com/postmodern/chruby/archive/v${version}.tar.gz", 
    default => $source_url, 
    } 
    notice($actual_source_url) 
} 
+0

谢谢,非常有帮助。 – iain