ParsePackageJsonWithNode 借助node_modules解析package.json pkgjson: 需要解析的package.json nodeMap: node_modules信息 key:node_modules下的package.json路径 pkgMap: 项目中存在的package.json信息 key:package.json的name
(pkgjson *PackageJson, nodeMap map[string]*PackageJson, pkgMap map[string]*PackageJson)
| 117 | // nodeMap: node_modules信息 key:node_modules下的package.json路径 |
| 118 | // pkgMap: 项目中存在的package.json信息 key:package.json的name |
| 119 | func ParsePackageJsonWithNode(pkgjson *PackageJson, nodeMap map[string]*PackageJson, pkgMap map[string]*PackageJson) *model.DepGraph { |
| 120 | |
| 121 | _dep := _depSet().LoadOrStore |
| 122 | |
| 123 | findDep := func(dev bool, name, version, basedir string) *model.DepGraph { |
| 124 | var subjs *PackageJson |
| 125 | if subjs == nil && len(nodeMap) > 0 { |
| 126 | // 从node_modules中查找 |
| 127 | _, subjs = findFromNodeModules(name, basedir, nodeMap) |
| 128 | } |
| 129 | if subjs == nil && len(pkgMap) > 0 { |
| 130 | // 从项目中查找 |
| 131 | if c, err := semver.NewConstraint(version); err == nil { |
| 132 | if pkg, ok := pkgMap[name]; ok { |
| 133 | if v, err := semver.NewVersion(pkg.Version); err == nil { |
| 134 | if c.Check(v) { |
| 135 | subjs = pkg |
| 136 | } |
| 137 | } |
| 138 | } |
| 139 | } |
| 140 | } |
| 141 | if subjs == nil { |
| 142 | // 从外部数据源下载 |
| 143 | subjs = npmOrigin(name, version) |
| 144 | } |
| 145 | if subjs == nil { |
| 146 | // 部分投毒组件会从官方库下架 这种构造一个虚拟的PacakgeJson保证检出 |
| 147 | subjs = &PackageJson{ |
| 148 | Name: name, |
| 149 | Version: version, |
| 150 | } |
| 151 | } |
| 152 | var dep *model.DepGraph |
| 153 | if dev { |
| 154 | dep = _dep(subjs.Name, subjs.Version, "dev") |
| 155 | } else { |
| 156 | dep = _dep(subjs.Name, subjs.Version) |
| 157 | } |
| 158 | if dep.Expand == nil { |
| 159 | // dep.AppendLicense(subjs.License) |
| 160 | dep.Expand = subjs |
| 161 | } |
| 162 | return dep |
| 163 | } |
| 164 | |
| 165 | root := &model.DepGraph{Name: pkgjson.Name, Version: pkgjson.Version, Path: pkgjson.File.Relpath()} |
| 166 | // root.AppendLicense(pkgjson.License) |
| 167 | root.Expand = pkgjson |
| 168 | |
| 169 | // 根节点需要添加开发组件 (需要在构建依赖图之前先添加开发组件 否则不会构建开发组件的子依赖) |
| 170 | for name, version := range pkgjson.DevDependencies { |
| 171 | root.AppendChild(findDep(true, name, version, pkgjson.File.Relpath())) |
| 172 | } |
| 173 | |
| 174 | // 遍历*路径*构建依赖图 |
| 175 | root.ForEachPath(func(p, n *model.DepGraph) bool { |
| 176 | js := n.Expand.(*PackageJson) |
no test coverage detected