Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid SelfResolvingDependency #749

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ class AsciidoctorJSExtension extends AbstractAsciidoctorJSExtension {
this.projectName = project.name
this.nodejs = project.extensions.getByType(AsciidoctorJSNodeExtension)
this.npm = project.extensions.getByType(AsciidoctorJSNpmExtension)
this.dependencyFactory = new NodeJSDependencyFactory(
this.dependencyFactory = project.objects.newInstance(
NodeJSDependencyFactory,
projectOperations,
this.nodejs,
this.npm
Expand All @@ -95,7 +96,8 @@ class AsciidoctorJSExtension extends AbstractAsciidoctorJSExtension {
this.projectName = task.project.name
this.nodejs = task.extensions.getByType(AsciidoctorJSNodeExtension)
this.npm = task.extensions.getByType(AsciidoctorJSNpmExtension)
this.dependencyFactory = new NodeJSDependencyFactory(
this.dependencyFactory = task.project.objects.newInstance(
NodeJSDependencyFactory,
projectOperations,
this.nodejs,
this.npm
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,31 @@ package org.asciidoctor.gradle.js.nodejs.core

import groovy.transform.CompileStatic
import org.asciidoctor.gradle.js.nodejs.internal.PackageDescriptor
import org.gradle.api.artifacts.SelfResolvingDependency
import org.ysb33r.gradle.nodejs.dependencies.npm.BaseNpmSelfResolvingDependency
import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.dsl.DependencyFactory
import org.gradle.api.file.FileCollection
import org.gradle.api.file.FileTree
import org.ysb33r.gradle.nodejs.NpmDependencyGroup
import org.ysb33r.gradle.nodejs.NpmPackageDescriptor
import org.ysb33r.gradle.nodejs.SimpleNpmPackageDescriptor
import org.ysb33r.gradle.nodejs.utils.npm.NpmExecutor
import org.ysb33r.grolifant.api.core.OperatingSystem
import org.ysb33r.grolifant.api.core.ProjectOperations

import javax.inject.Inject
import java.util.concurrent.Callable

/**
* A factory class for creating NPM self resolving dependencies in a Gradle context.
* A factory class for creating NPM dependencies in a Gradle context.
*
* @author Schalk W. Cronjé
*
* @since 3.0
*/
@CompileStatic
class NodeJSDependencyFactory {
abstract class NodeJSDependencyFactory {
private final ProjectOperations projectOperations
private final AsciidoctorJSNodeExtension nodejs
private final AsciidoctorJSNpmExtension npm
private final NpmExecutor npmExecutor

/** Instantiates a factory for a specific context.
*
Expand All @@ -42,28 +51,31 @@ class NodeJSDependencyFactory {
*
* @since 4.0
*/
@Inject
NodeJSDependencyFactory(
ProjectOperations po,
AsciidoctorJSNodeExtension nodejs,
AsciidoctorJSNpmExtension npm
) {
this.projectOperations = po
this.nodejs = nodejs
this.npm = npm
this.npmExecutor = new NpmExecutor(po, nodejs, npm)
}

/** Create a NPM-based self-resolving dependency.
@Inject
protected abstract DependencyFactory getDependencyFactory()

/** Create a NPM-based dependency.
*
* @param pkg Description of the NPM package
* @param version Version (tag) of the NPM package.
* @return A Gradle-style resolvable dependency.
*/
@SuppressWarnings('FactoryMethodName')
SelfResolvingDependency createDependency(final PackageDescriptor pkg, final String version) {
createDependency(pkg.name, version, pkg.scope)
Dependency createDependency(final PackageDescriptor pkg, final String version) {
createDependency(pkg, version, null)
}

/** Create a NPM-based self-resolving dependency.
/** Create a NPM-based dependency.
*
* This version allows for additional system search paths to be added in case
* the package will require it during the installation process.
Expand All @@ -74,15 +86,16 @@ class NodeJSDependencyFactory {
* @return A Gradle-style resolvable dependency.
*/
@SuppressWarnings('FactoryMethodName')
SelfResolvingDependency createDependency(
Dependency createDependency(
final PackageDescriptor pkg,
final String version,
final Set<File> withPaths
) {
createDependency(pkg.name, version, pkg.scope, withPaths)
NpmPackageDescriptor descriptor = new SimpleNpmPackageDescriptor(pkg.scope, pkg.name, version)
createDependency(descriptor, withPaths)
}

/** Create a NPM-based self-resolving dependency.
/** Create a NPM-based dependency.
*
* @param name Name of NPM package.
* @param version Version (tag) of NPM package.
Expand All @@ -91,32 +104,42 @@ class NodeJSDependencyFactory {
* @return A Gradle-style resolvable dependency.
*/
@SuppressWarnings('FactoryMethodName')
SelfResolvingDependency createDependency(
final String name,
final String version,
final String scope,
Dependency createDependency(
final NpmPackageDescriptor descriptor,
final Set<File> withPaths = null
) {
Map<String, Object> description = [
name : name,
tag : version,
type : 'dev',
'install-args': ['--no-bin-links', '--no-package-lock', '--loglevel=error']
]
// Wrap actual file collection in a Callable to prevent eager installation of package
Callable<FileCollection> fileCollectionSupplier = () -> {
getPackageFiles(descriptor, withPaths)
}
return dependencyFactory.create(
projectOperations.fsOperations.emptyFileCollection().from(fileCollectionSupplier)
)
}

if (scope) {
description.put('scope', scope)
private FileCollection getPackageFiles(
final NpmPackageDescriptor descriptor,
final Set<File> withPaths
) {
File installDir = npmExecutor.getPackageInstallationFolder(descriptor)
FileTree allFiles = projectOperations.fileTree(installDir)

if (allFiles.isEmpty()) {
installPackage(withPaths, descriptor)
}

allFiles
}

private void installPackage(Set<File> withPaths, NpmPackageDescriptor descriptor) {
Map<String, Object> env = [:]
if (withPaths) {
description.put('path', projectOperations.fsOperations.files(withPaths).asPath)
String path = projectOperations.fsOperations.files(withPaths).asPath
env[OperatingSystem.current().pathVar] = path
}

new BaseNpmSelfResolvingDependency(
projectOperations,
nodejs,
npm,
description
)
List<String> installArgs = projectOperations.stringTools.stringize(['--no-bin-links', '--no-package-lock', '--loglevel=error'])
npmExecutor.installNpmPackage(descriptor, NpmDependencyGroup.DEVELOPMENT, installArgs, env).files
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import org.asciidoctor.gradle.js.nodejs.internal.PackageDescriptor
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.SelfResolvingDependency
import org.ysb33r.gradle.nodejs.NpmPackageDescriptor
import org.ysb33r.gradle.nodejs.utils.npm.NpmExecutor
import org.ysb33r.grolifant.api.core.ProjectOperations
Expand Down Expand Up @@ -65,14 +64,16 @@ class DeckTapeExtension {
final NodeJSDependencyFactory factory = new NodeJSDependencyFactory(po, nodejs, npm)
final NpmExecutor npmExecutor = new NpmExecutor(po, nodejs, npm)

final NpmPackageDescriptor pregypDescriptor = new SimpleNpmPackageDescriptor(PACKAGE_PREGYP.scope, PACKAGE_PREGYP.name, pregypVersion)

// Ensure puppeteer is installed first
final List<SelfResolvingDependency> deps = [
final List<Dependency> deps = [
factory.createDependency(PACKAGE_PUPPETEER, puppeteerVersion),
factory.createDependency(PACKAGE_PREGYP, pregypVersion)
factory.createDependency(pregypDescriptor)
]

File preGypBinPath = new File(
npmExecutor.getPackageInstallationFolder((NpmPackageDescriptor) deps[1]),
npmExecutor.getPackageInstallationFolder(pregypDescriptor),
'bin'
)

Expand Down