[Gradle, JS] Use gradle dependency constraints for yarn resolutions

^KT-41054 fixed
This commit is contained in:
Ilya Goncharov
2020-07-31 11:29:53 +03:00
parent 7d883f1806
commit 0473648b0e
7 changed files with 111 additions and 10 deletions
@@ -21,7 +21,8 @@ interface NpmApi {
fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
subProjects: Collection<KotlinCompilationNpmResolution>,
resolutions: Map<String, String>
)
fun resolveRootProject(
@@ -0,0 +1,77 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.targets.js.npm
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.artifacts.*
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.internal.artifacts.DefaultModuleIdentifier
import org.gradle.api.internal.artifacts.dependencies.DefaultMutableVersionConstraint
import org.gradle.api.internal.artifacts.dependencies.DependencyConstraintInternal
import org.gradle.api.internal.attributes.ImmutableAttributes
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
class NpmDependencyConstraint(
internal val project: Project,
private val name: String,
private val version: String,
val scope: NpmDependency.Scope = NpmDependency.Scope.NORMAL
) : DependencyConstraintInternal {
private val moduleIdentifier = DefaultModuleIdentifier.newId(null, name);
private val versionConstraint = DefaultMutableVersionConstraint(version)
override fun getGroup(): String? = moduleIdentifier.group
override fun getName(): String = moduleIdentifier.name
override fun getVersion(): String = versionConstraint.version
override fun matchesStrictly(p0: ModuleVersionIdentifier): Boolean {
TODO("Not yet implemented")
}
override fun getModule(): ModuleIdentifier {
return moduleIdentifier
}
override fun getAttributes(): AttributeContainer {
return ImmutableAttributes.EMPTY
}
override fun attributes(p0: Action<in AttributeContainer>): DependencyConstraint {
return this
}
override fun version(p0: Action<in MutableVersionConstraint>) {
TODO("Not yet implemented")
}
override fun getReason(): String? {
return null
}
override fun because(p0: String?) {
TODO("Not yet implemented")
}
override fun getVersionConstraint(): VersionConstraint {
println("get version constraint")
val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
nodeJs.npmResolutionManager.requireConfiguringState()
.resolutions[name] = version
return versionConstraint
}
override fun setForce(p0: Boolean) {
}
override fun isForce(): Boolean {
return false
}
}
@@ -31,6 +31,8 @@ class PackageJson(
var workspaces: Collection<String>? = null
var resolutions: Map<String, String>? = null
@Suppress("USELESS_ELVIS")
val devDependencies = mutableMapOf<String, String>()
get() = field ?: mutableMapOf()
@@ -49,6 +49,7 @@ internal class KotlinRootNpmResolver internal constructor(
val compositeNodeModules = CompositeNodeModulesCache(nodeJs)
val packageJsonUmbrella = rootProject.registerTask(PACKAGE_JSON_UMBRELLA_TASK_NAME, Task::class.java) {}
val projectResolvers = mutableMapOf<Project, KotlinProjectNpmResolver>()
val resolutions = mutableMapOf<String, String>()
fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved."
@@ -110,7 +111,8 @@ internal class KotlinRootNpmResolver internal constructor(
nodeJs.packageManager.prepareRootProject(
rootProject,
allNpmPackages
allNpmPackages,
resolutions
)
return Installation(
@@ -30,11 +30,13 @@ class Yarn : NpmApi {
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
subProjects: Collection<KotlinCompilationNpmResolution>,
resolutions: Map<String, String>
) = getDelegate(rootProject.project)
.prepareRootProject(
rootProject,
subProjects
subProjects,
resolutions
)
override fun resolveRootProject(
@@ -44,7 +46,12 @@ class Yarn : NpmApi {
cliArgs: List<String>
) {
getDelegate(rootProject.project)
.resolveRootProject(rootProject, npmProjects, skipExecution, cliArgs)
.resolveRootProject(
rootProject,
npmProjects,
skipExecution,
cliArgs
)
}
override fun resolveDependency(
@@ -33,7 +33,8 @@ class YarnSimple : YarnBasics() {
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
subProjects: Collection<KotlinCompilationNpmResolution>,
resolutions: Map<String, String>
) = Unit
override fun resolveRootProject(
@@ -26,23 +26,31 @@ class YarnWorkspaces : YarnBasics() {
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
subProjects: Collection<KotlinCompilationNpmResolution>,
resolutions: Map<String, String>
) {
check(rootProject == rootProject.rootProject)
setup(rootProject)
return prepareRootPackageJson(
rootProject,
subProjects
subProjects,
resolutions
)
}
private fun prepareRootPackageJson(
rootProject: Project,
npmProjects: Collection<KotlinCompilationNpmResolution>
npmProjects: Collection<KotlinCompilationNpmResolution>,
resolutions: Map<String, String>
) {
val rootPackageJsonFile = preparedFiles(rootProject).single()
saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, rootPackageJsonFile)
saveRootProjectWorkspacesPackageJson(
rootProject,
npmProjects,
resolutions,
rootPackageJsonFile
)
}
override fun resolveRootProject(
@@ -68,6 +76,7 @@ class YarnWorkspaces : YarnBasics() {
private fun saveRootProjectWorkspacesPackageJson(
rootProject: Project,
npmProjects: Collection<KotlinCompilationNpmResolution>,
resolutions: Map<String, String>,
rootPackageJsonFile: File
) {
val nodeJsWorldDir = rootPackageJsonFile.parentFile
@@ -79,6 +88,8 @@ class YarnWorkspaces : YarnBasics() {
YarnImportedPackagesVersionResolver(rootProject, npmProjects, nodeJsWorldDir).resolveAndUpdatePackages()
rootPackageJson.workspaces = npmProjectWorkspaces + importedProjectWorkspaces
println("resolutions $resolutions")
rootPackageJson.resolutions = resolutions
rootPackageJson.saveTo(
rootPackageJsonFile
)