forked from node-gradle/gradle-node-plugin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNodeSetupTask.kt
101 lines (86 loc) · 3.25 KB
/
NodeSetupTask.kt
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
package com.github.gradle.node.task
import com.github.gradle.node.NodeExtension
import com.github.gradle.node.NodePlugin
import com.github.gradle.node.util.ProjectApiHelper
import com.github.gradle.node.variant.VariantComputer
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.*
import java.io.File
import java.nio.file.Files
import java.nio.file.Paths
import javax.inject.Inject
abstract class NodeSetupTask : BaseTask() {
@get:Inject
abstract val objects: ObjectFactory
@get:Inject
abstract val providers: ProviderFactory
private val nodeExtension = NodeExtension[project]
@get:Input
val download = nodeExtension.download
@get:InputFile
val nodeArchiveFile = objects.fileProperty()
@get:OutputDirectory
val nodeDir by lazy {
variantComputer.computeNodeDir(nodeExtension)
}
@get:Internal
val projectHelper = ProjectApiHelper.newInstance(project)
init {
group = NodePlugin.NODE_GROUP
description = "Download and install a local node/npm version."
onlyIf {
nodeExtension.download.get()
}
}
@TaskAction
fun exec() {
deleteExistingNode()
unpackNodeArchive()
setExecutableFlag()
}
private fun deleteExistingNode() {
projectHelper.delete {
delete(nodeDir.get().dir("../"))
}
}
private fun unpackNodeArchive() {
val archiveFile = nodeArchiveFile.get().asFile
val nodeDirProvider = variantComputer.computeNodeDir(nodeExtension)
val nodeBinDirProvider = variantComputer.computeNodeBinDir(nodeDirProvider)
if (archiveFile.name.endsWith("zip")) {
projectHelper.copy {
from(projectHelper.zipTree(archiveFile))
into(nodeDirProvider.map { it.dir("../") })
}
} else {
projectHelper.copy {
from(projectHelper.tarTree(archiveFile))
into(nodeDirProvider.map { it.dir("../") })
}
// Fix broken symlink
val nodeBinDirPath = nodeBinDirProvider.get().asFile.toPath()
val npm = nodeBinDirPath.resolve("npm")
val npmScriptFile = variantComputer.computeNpmScriptFile(nodeDirProvider, "npm").get()
if (Files.deleteIfExists(npm)) {
Files.createSymbolicLink(npm, nodeBinDirPath.relativize(Paths.get(npmScriptFile)))
}
val npx = nodeBinDirPath.resolve("npx")
val npxScriptFile = variantComputer.computeNpmScriptFile(nodeDirProvider, "npx").get()
if (Files.deleteIfExists(npx)) {
Files.createSymbolicLink(npx, nodeBinDirPath.relativize(Paths.get(npxScriptFile)))
}
}
}
private fun setExecutableFlag() {
if (!platformHelper.isWindows) {
val nodeDirProvider = variantComputer.computeNodeDir(nodeExtension)
val nodeBinDirProvider = variantComputer.computeNodeBinDir(nodeDirProvider)
val nodeExecProvider = variantComputer.computeNodeExec(nodeExtension, nodeBinDirProvider)
File(nodeExecProvider.get()).setExecutable(true)
}
}
companion object {
const val NAME = "nodeSetup"
}
}