2016-04-25 15 views
5

Bower sembra deviare dalla semver spec in quanto a volte vedo le dipendenze che assomigliano a questo (da 2klic-angolare/bower.json):di analisi Bower

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

This question va un lungo cammino verso la spiegazione del semere stesso ma non tanto su cosa sta succedendo con la porzione s-yadav/angulargrid #.

Guardando pergolato/lib/node_modules/pergolato-endpoint-parser/index.js

vedo il seguente codice:

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 
    }; 
} 

Così sembra che una fonte repository può essere specificata come parte della versione di dipendenza utilizzando # come delimitatore.

Tuttavia non sono riuscito a trovare nulla che descriva questo nei documenti del bower.

Sono presenti altri avvertimenti con l'interpretazione di Bowers del semere o è l'unico, ed è sufficiente dividere la stringa in # per trovare l'espressione del requisito?

risposta

1

È possibile trovare il codice corrispondente a pergolato/lib/node_modules/pergolato-endpoint-parser/index.js in 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); 
} 

Così che cosa diventa in seguito il target è generato dividendo il valore della Array di dipendenze JSON di #. Questo target viene analizzato da un resolver, quindi il comportamento effettivo dipende dal risolutore utilizzato, ma il resolver tipico utilizza node-semver, se node-semver può analizzarlo. Altrimenti usa id di commit, nomi di rami, tag ecc.

Quindi dividere la stringa di "#" e tagliare gli spazi in seguito è sufficiente per trovare l'espressione dei requisiti, ma potrebbe non essere una versione di semere, dopo tutto.

+0

Buona spiegazione, grazie – andrew