解析Bower的语义化版本号语法

5

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

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

这个问题在很大程度上解释了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
    };
}

看起来,存储库源可以作为依赖版本的一部分使用#作为分隔符进行指定。
但是我找不到任何描述这一点的bower文档。
在Bower对semver的解释方面还有其他需要注意的地方吗?或者这是唯一的一个,而且仅仅在#处拆分字符串就足以找到要求表达式了吗?
1个回答

1
你可以在 bower/lib/node_modules/bower-endpoint-parser/index.js 中找到相关代码,它位于 json2decomposed 中:
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依赖项数组中的值按#分割生成的。这个target由一个resolver解析,因此实际行为取决于使用的解析器,但典型的解析器使用node-semver,如果node-semver可以解析它。否则它使用提交ID、分支名称、标签等。因此,通过'#'拆分字符串并在之后修剪空格就足以找到要求表达式,但它可能不是semver版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接