Blame view

node_modules/node-gyp/lib/process-release.js 5.99 KB
2a09d1a4   liuqimichale   添加宜春 天水 宣化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  var semver = require('semver')
    , url = require('url')
    , path = require('path')
    , log = require('npmlog')
  
      // versions where -headers.tar.gz started shipping
    , headersTarballRange = '>= 3.0.0 || ~0.12.10 || ~0.10.42'
    , bitsre = /\/win-(x86|x64)\//
    , bitsreV3 = /\/win-(x86|ia32|x64)\// // io.js v3.x.x shipped with "ia32" but should
                                          // have been "x86"
  
  // Captures all the logic required to determine download URLs, local directory and 
  // file names. Inputs come from command-line switches (--target, --dist-url),
  // `process.version` and `process.release` where it exists.
  function processRelease (argv, gyp, defaultVersion, defaultRelease) {
    var version = (semver.valid(argv[0]) && argv[0]) || gyp.opts.target || defaultVersion
      , versionSemver = semver.parse(version)
      , overrideDistUrl = gyp.opts['dist-url'] || gyp.opts.disturl
      , isDefaultVersion
      , isIojs
      , name
      , distBaseUrl
      , baseUrl
      , libUrl32
      , libUrl64
      , tarballUrl
      , canGetHeaders
  
    if (!versionSemver) {
      // not a valid semver string, nothing we can do
      return { version: version }
    }
    // flatten version into String
    version = versionSemver.version
  
    // defaultVersion should come from process.version so ought to be valid semver
    isDefaultVersion = version === semver.parse(defaultVersion).version
  
    // can't use process.release if we're using --target=x.y.z
    if (!isDefaultVersion)
      defaultRelease = null
  
    if (defaultRelease) {
      // v3 onward, has process.release
      name = defaultRelease.name.replace(/io\.js/, 'iojs') // remove the '.' for directory naming purposes
      isIojs = name === 'iojs'
    } else {
      // old node or alternative --target=
      // semver.satisfies() doesn't like prerelease tags so test major directly
      isIojs = versionSemver.major >= 1 && versionSemver.major < 4
      name = isIojs ? 'iojs' : 'node'
    }
  
    // check for the nvm.sh standard mirror env variables
    if (!overrideDistUrl) {
      if (isIojs) {
        if (process.env.IOJS_ORG_MIRROR) {
          overrideDistUrl = process.env.IOJS_ORG_MIRROR
        } else if (process.env.NVM_IOJS_ORG_MIRROR) {// remove on next semver-major
          overrideDistUrl = process.env.NVM_IOJS_ORG_MIRROR
          log.warn('download',
              'NVM_IOJS_ORG_MIRROR is deprecated and will be removed in node-gyp v4, ' +
              'please use IOJS_ORG_MIRROR')
        }
      } else {
        if (process.env.NODEJS_ORG_MIRROR) {
          overrideDistUrl = process.env.NODEJS_ORG_MIRROR
        } else if (process.env.NVM_NODEJS_ORG_MIRROR) {// remove on next semver-major
          overrideDistUrl = process.env.NVM_NODEJS_ORG_MIRROR
          log.warn('download',
              'NVM_NODEJS_ORG_MIRROR is deprecated and will be removed in node-gyp v4, ' +
              'please use NODEJS_ORG_MIRROR')
        }
      }
    }
  
    if (overrideDistUrl)
      log.verbose('download', 'using dist-url', overrideDistUrl)
  
    if (overrideDistUrl)
      distBaseUrl = overrideDistUrl.replace(/\/+$/, '')
    else
      distBaseUrl = isIojs ? 'https://iojs.org/download/release' : 'https://nodejs.org/dist'
    distBaseUrl += '/v' + version + '/'
  
    // new style, based on process.release so we have a lot of the data we need
    if (defaultRelease && defaultRelease.headersUrl && !overrideDistUrl) {
      baseUrl = url.resolve(defaultRelease.headersUrl, './')
      libUrl32 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x86', versionSemver.major)
      libUrl64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x64', versionSemver.major)
  
      return {
        version: version,
        semver: versionSemver,
        name: name,
        baseUrl: baseUrl,
        tarballUrl: defaultRelease.headersUrl,
        shasumsUrl: url.resolve(baseUrl, 'SHASUMS256.txt'),
        versionDir: (name !== 'node' ? name + '-' : '') + version,
        libUrl32: libUrl32,
        libUrl64: libUrl64,
        libPath32: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl32).path)),
        libPath64: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl64).path))
      }
    }
  
    // older versions without process.release are captured here and we have to make
    // a lot of assumptions, additionally if you --target=x.y.z then we can't use the
    // current process.release
  
    baseUrl = distBaseUrl
    libUrl32 = resolveLibUrl(name, baseUrl, 'x86', versionSemver.major)
    libUrl64 = resolveLibUrl(name, baseUrl, 'x64', versionSemver.major)
    // making the bold assumption that anything with a version number >3.0.0 will
    // have a *-headers.tar.gz file in its dist location, even some frankenstein
    // custom version
    canGetHeaders = semver.satisfies(versionSemver, headersTarballRange)
    tarballUrl = url.resolve(baseUrl, name + '-v' + version + (canGetHeaders ? '-headers' : '') + '.tar.gz')
  
    return {
      version: version,
      semver: versionSemver,
      name: name,
      baseUrl: baseUrl,
      tarballUrl: tarballUrl,
      shasumsUrl: url.resolve(baseUrl, 'SHASUMS256.txt'),
      versionDir: (name !== 'node' ? name + '-' : '') + version,
      libUrl32: libUrl32,
      libUrl64: libUrl64,
      libPath32: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl32).path)),
      libPath64: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl64).path))
    }
  }
  
  function normalizePath (p) {
    return path.normalize(p).replace(/\\/g, '/')
  }
  
  function resolveLibUrl (name, defaultUrl, arch, versionMajor) {
    var base = url.resolve(defaultUrl, './')
      , hasLibUrl = bitsre.test(defaultUrl) || (versionMajor === 3 && bitsreV3.test(defaultUrl))
  
    if (!hasLibUrl) {
      // let's assume it's a baseUrl then
      if (versionMajor >= 1)
        return url.resolve(base, 'win-' + arch  +'/' + name + '.lib')
      // prior to io.js@1.0.0 32-bit node.lib lives in /, 64-bit lives in /x64/
      return url.resolve(base, (arch === 'x64' ? 'x64/' : '') + name + '.lib')
    }
  
    // else we have a proper url to a .lib, just make sure it's the right arch
    return defaultUrl.replace(versionMajor === 3 ? bitsreV3 : bitsre, '/win-' + arch + '/')
  }
  
  module.exports = processRelease