I want to use `net.rubygrapefruit:native-platform`...
# community-support
a
I want to use
net.rubygrapefruit:native-platform
in a pet project but it has a lot of variants for specific OSes that are downloaded unnecessarily. It seems to be published without Gradle module metadata. Is there an existing ComponentMetadataRule so I can only download a suitable variant for the current OS & arch?
v
Where do you even get it from? It is not on MC and its Readme is maaaaajorly outdated.
Ah, in their JFrog instane, I see. Seems to me the intention is, that you ship all (like Gradle is doing) to support all supported ones in the result package. 🤷‍♂️
But I'd say something "simple" like this should do:
Copy code
dependencies {
    components {
        withModule("net.rubygrapefruit:native-platform") {
            addVariant("runtimeLinuxAmd64", "runtime") {
                withDependencies {
                    removeIf {
                        it.name.startsWith("native-platform-") && it.name.contains("linux-amd64").not()
                    }
                }
                attributes {
                    attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(OperatingSystemFamily.LINUX))
                    attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(MachineArchitecture.X86_64))
                }
            }
            addVariant("runtimeLinuxAarch64", "runtime") {
                withDependencies {
                    removeIf {
                        it.name.startsWith("native-platform-") && it.name.contains("linux-aarch64").not()
                    }
                }
                attributes {
                    attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(OperatingSystemFamily.LINUX))
                    attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(MachineArchitecture.ARM64))
                }
            }
            addVariant("runtimeWindowsI386", "runtime") {
                withDependencies {
                    removeIf {
                        it.name.startsWith("native-platform-") && it.name.contains("windows-i386").not()
                    }
                }
                attributes {
                    attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(OperatingSystemFamily.WINDOWS))
                    attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(MachineArchitecture.X86))
                }
            }
            addVariant("runtimeWindowsAmd64", "runtime") {
                withDependencies {
                    removeIf {
                        it.name.startsWith("native-platform-") && it.name.contains("windows-amd64").not()
                    }
                }
                attributes {
                    attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(OperatingSystemFamily.WINDOWS))
                    attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(MachineArchitecture.X86_64))
                }
            }
            addVariant("runtimeOsxAmd64", "runtime") {
                withDependencies {
                    removeIf {
                        it.name.startsWith("native-platform-") && it.name.contains("osx-amd64").not()
                    }
                }
                attributes {
                    attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(OperatingSystemFamily.MACOS))
                    attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(MachineArchitecture.X86_64))
                }
            }
            addVariant("runtimeOsxAarch64", "runtime") {
                withDependencies {
                    removeIf {
                        it.name.startsWith("native-platform-") && it.name.contains("osx-aarch64").not()
                    }
                }
                attributes {
                    attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(OperatingSystemFamily.MACOS))
                    attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(MachineArchitecture.ARM64))
                }
            }
            addVariant("runtimeFreebsdAmd64", "runtime") {
                withDependencies {
                    removeIf {
                        it.name.startsWith("native-platform-") && it.name.contains("freebsd-amd64").not()
                    }
                }
                attributes {
                    attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named("freebsd"))
                    attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(MachineArchitecture.X86_64))
                }
            }
        }
    }
}
Or a "bit" condensed 😄
Copy code
dependencies {
    components {
        withModule("net.rubygrapefruit:native-platform") {
            listOf(
                Triple("linux-amd64", OperatingSystemFamily.LINUX, MachineArchitecture.X86_64),
                Triple("linux-aarch64", OperatingSystemFamily.LINUX, MachineArchitecture.ARM64),
                Triple("windows-i386", OperatingSystemFamily.WINDOWS, MachineArchitecture.X86),
                Triple("windows-amd64", OperatingSystemFamily.WINDOWS, MachineArchitecture.X86_64),
                Triple("osx-amd64", OperatingSystemFamily.MACOS, MachineArchitecture.X86_64),
                Triple("osx-aarch64", OperatingSystemFamily.MACOS, MachineArchitecture.ARM64),
                Triple("freebsd-amd64", "freebsd", MachineArchitecture.X86_64),
            ).forEach { (classifier, os, arch) ->
                addVariant("runtime-$classifier", "runtime") {
                    withDependencies {
                        removeIf {
                            it.name.startsWith("native-platform-") && it.name.contains(classifier).not()
                        }
                    }
                    attributes {
                        attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(os))
                        attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(arch))
                    }
                }
            }
        }
    }
}