为什么Shake依赖是明确的`需要'?

时间:2016-02-29 17:24:37

标签: shake-build-system

我发现Shake使用enter image description here的第一个example用于演示似乎容易出错的模式:

    contents <- readFileLines $ out -<.> "txt"
    need contents
    cmd "tar -cf" [out] contents

为什么need contents在读取readFileLinescmd引用它们时需要ApplicativeDo?这样我们可以避免要求 var members = req.body.members; models.sequelize.transaction(function (t) { for (var i = 0; i < members.length; i++) { return models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}).then(function(user) { return user.addInvitations([group], {transaction: t}).then(function(){}).catch(function(err){return next(err);}); }) }; }).then(function (result) { console.log("YAY"); }).catch(function (err) { console.log("NO!!!"); return next(err); }); 吗?

1 个答案:

答案 0 :(得分:2)

我认为部分混淆可能是contents的类型/语义。文件out -<.> "txt"包含文件名列表,因此contents是文件名列表。当我们need contents时,我们需要创建和依赖文件本身,使用文件名来指定哪些文件。当我们将contents传递给cmd时,我们会传递tar将用于查询文件的文件名。

所以关键点是readFileLines不会读取有问题的文件,它只会从另一个文件中读取文件名。我们必须使用need来确保使用这些文件很好,然后我们实际使用cmd中的文件。查看这三行的另一种方法是:

  1. 我们想要操作哪些文件?
  2. 确保这些文件准备就绪。
  3. 使用这些文件。
  4. 这有意义吗?与ApplicativeDo没有任何关系 - 它的存在根本无法帮助我们。