function resolveLocal (nodeModules, parentTarget, name, version, isExplicit) {
	const linkname = path.join(nodeModules, parentTarget, 'node_modules', name)
	const mockFetch = () => EmptyObservable.create()
	log(`resolving ${linkname} from node_modules`)

	// support `file:` with symlinks
	if (version.substr(0, 5) === 'file:') {
		log(`resolved ${name}@${version} as local symlink`)
		const isScoped = name.charAt(0) === '@'
		const src = path.join(parentTarget, isScoped ? '..' : '', version.substr(5))
		const dst = path.join('node_modules', parentTarget, 'node_modules', name)
		return util.forceSymlink(src, dst)::_finally(progress.complete)
	}

	return util.readlink(linkname)::mergeMap((rel) => {
		const target = path.basename(path.dirname(rel))
		const filename = path.join(linkname, 'package.json')
		log(`reading package.json from ${filename}`)

		return util.readFileJSON(filename)::map((pkgJson) => {
			if (isExplicit && !satisfies(pkgJson.version, version)) {
				throw new LocalConflictError(name, pkgJson.version, version)
			}
			return {parentTarget, pkgJson, target, name, fetch: mockFetch}
		})
	})
}
resolve a dependency's `package.json` file from the local file system.
@param	{String} nodeModules - `node_modules` base directory.
@param	{String} parentTarget - relative parent's node_modules path.
@param	{String} name - name of the dependency.
@param	{String} version - version of the dependency.
@param	{Boolean} isExplicit - whether the install command asks for an explicit install.
@return {Observable} - observable sequence of `package.json` objects.