解析Bower的语义版本语法

时间:2016-04-25 18:30:54

标签: bower semantic-versioning

Bower似乎偏离了semver spec,因为我有时会看到这样的依赖关系(来自 2klic-angular / bower.json ):

  "dependencies": {
    "angulargrid": "s-yadav/angulargrid#^0.4.0"
  }

This question在解释semver本身方面有很长的路要走,但与 s-yadav / angulargrid#部分的内容不同。

查看 bower / lib / node_modules / bower-endpoint-parser / index.js

我看到以下代码:

function decompose(endpoint) {
    // Note that we allow spaces in targets and sources but they are trimmed
    var regExp = /^(?:([\w\-]|(?:[\w\.\-]+[\w\-])?)=)?([^\|#]+)(?:#(.*))?$/;
    var matches = endpoint.match(regExp);
    var target;
    var error;

    if (!matches) {
        error = new Error('Invalid endpoint: ' + endpoint);
        error.code = 'EINVEND';
        throw error;
    }

    target = trim(matches[3]);

    return {
        name: trim(matches[1]),
        source: trim(matches[2]),
        target: isWildcard(target) ? '*' : target
    };
}

因此,似乎可以使用作为分隔符将存储库源指定为依赖项版本的一部分。

但是我还没能在凉亭文档中找到任何描述这一点的内容。

Bowers对semver的解释是否有任何其他注意事项或者这是唯一的注意事项,是否足以将字符串拆分为以找到需求表达式?

1 个答案:

答案 0 :(得分:1)

您可以在json2decomposed中的bower / lib / node_modules / bower-endpoint-parser / index.js中找到相关代码:

function json2decomposed(key, value) {
    ...
    key = trim(key);
    value = trim(value);
    ...
    endpoint = key + '=';
    split = value.split('#').map(trim);

    // If # was found, the source was specified
    if (split.length > 1) {
        endpoint += (split[0] || key) + '#' + split[1];
    // Check if value looks like a source
    } else if (isSource(value)) {
        endpoint += value + '#*';
    // Otherwise use the key as the source
    } else {
        endpoint += key + '#' + split[0];
    }

    return decompose(endpoint);
}

因此,后来成为target的方法是通过#将JSON依赖关系数组中的值拆分而生成的。此targetresolver解析,因此实际行为取决于所使用的解析程序,但典型的解析程序使用node-semver,如果node-semver可以解析它。否则它使用提交ID,分支名称,标签等。

将字符串拆分为'#'并且之后修剪空格足以找到需求表达式,但它毕竟可能不是一个半版本。