plugins { id "org.implab.gradle-typescript" id "org.implab.gradle-npm-package" id "ivy-publish" } typescript { useTsc npm.bin("tsc") compilerOptions { incremental = true } jsVariants { node { jsRuntime = "node" jsModule = "commonjs" } browser { jsRuntime = "browser" jsModule = "amd" } } } def typingsFromMain = { sets { named("compileOnlyTypings") { srcDir main.output("typings") } } } variants { all { } } // варианты сборки variants { configureEach { variant -> // для каждого варианта есть стандартные настройки def sourceSetLocation = { setName, self -> self.sourceSetDir = layout.projectDirectory.dir("src/${setName}") self.outputsDir = layout.buildDirectory.dir("${variant.name}/${setName}") } def main = sources.register("${variant.name}Main", sourceSetLocation.curry("main")) def test = sources.register("${variant.name}Test", sourceSetLocation.curry("test")) // явно добавляем наборы в вариант для применения политик и агрегации результатов sourceSets { add(main, role: "main") add(test, role: "test") } } register("browser") { // специфичные наборы для варианта def srcMainAmd = sources.register("mainAmd", typingsFromMain) def srcTestAmd = sources.register("testAmd", typingsFromMain) // применение аспекта компиляции ts для данного варианта // advice to all TypescriptCompile tasks typescriptCompile { baseTsConfig = file("src/tsconfig.browser.json") } sourceSets { add(srcMainAmd, role: "main") add(srcTestAmd, role: "test") } } register("node") { // специфичные наборы для варианта def srcMainCjs = sources.register("mainCjs", typingsFromMain) def srcTestCjs = sources.register("testCjs", typingsFromMain) // применение аспекта компиляции ts для данного варианта typescriptCompile { baseTsConfig = file("src/tsconfig.node.json") } sourceSets { add(srcMainCjs, role: "main") add(srcTestCjs, role: "test") } } } npmPackaging { usePackageJson() metadata { name = "@implab/core" version = project.provider { project.version.toString() } } // creates writeBrowserPackageJson npmPackBrowser, npmPublishBrowser variant("browser") { metadata { name = "@implab/core-amd" } variantOutputs("main") } // creates writeNodePackageJson, npmPackNode, npmPublishNode variant("node") { metadata { name = "@implab/core-node" } variantOutputs("main") } // creates writePackageJson, npmPack, npmPublish package { metadata { name = "@implab/core-amd" } content { // CopySpec // как-то кривенько from(variants.named("node").map { it.outputs("main") }) { into "dist/node" } from(variants.named("browser").map { it.outputs("main") }) { into "dist/node" } } } } outgoingJs { } outgoingVariants { // registers nodeElements configuration variant("node") { // ConfigurationPublications // как-то шумно attribute(JS_RUNTIME, "node") attribute(JS_MODULE, "commonjs") attribute(JS_TARGET, "es2020") attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, "npm-module")) // основной артефакт, связь по имени задачи, неудачный вариант artifact(tasks.named("npmPackNode")) // variants... кругом variants variants { exploded { attributes { // шумновато, но это стандартное API gradle attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, "exploded-npm-module")) } // связь по имени задачи, неудачный вариант artifact(tasks.named("assembleNodeModule")) } typings { attributes { attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, "typescript-typings")) } // связь по имени задачи, неудачный вариант artifact(tasks.named("assembleNode")) } } } variant("browser") { // все те же проблемы что и для variant("node") attribute(JS_RUNTIME, "browser") attribute(JS_MODULE, "amd") attribute(JS_TARGET, "es2015") attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, "npm-module")) artifact(tasks.named("npmPackBrowser")) variants { variants { typings { attributes { attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, "typescript-typings")) } artifact(tasks.named("assembleNode")) } } } } } publishing { repositories { ivy { url "${System.properties["user.home"]}/ivy-repo" } } publications { ivy(IvyPublication) { from components.js } } }