28 oct. 2015, 23:11

Sommaire

Introduction

Vous voulez mettre en ligne vos mods sur votre site web via ftp ? Alors vous êtes au bon endroit.

Pré-requis

Code

Tout d’abord, nous allons créer un fichier (ici je l’appelerai private.properties) pour y stocker notre identifiant ftp ainsi que le mot de passe (vous n’êtes pas obligé de le mettre dans un fichier à part mais si vous voulez mettre vos sources sur github, vous aurez juste à ajouter le fichier au .gitignore) :

Voici le contenu du fichier private.properties

ftp_adress=<l'adresse pour vous connecter via ftp>ftp_user=<votre identifiant>ftp_pw=<votre mot de passe>

NOTE : vous pouvez mettre ce que vous voulez avant le “=” tant que vous mettez le même par la suite

Maintenant nous allons devoir récupérer le contenu de ce fichier (de la même façon que dans le tutoriel Utiliser gradle pour gérer les dépendances) :

ext.privateConfigFile = file 'private.properties' // le nom de votre fichier

privateConfigFile.withReader {
    def p = new Properties()
    p.load(it)
    project.ext.privateConfig = new ConfigSlurper().parse p // privateConfig sera le nom utilisé pour accéder aux valeurs
}

Pour pouvoir utiliser la librairie de ant, nous allons la déclarer en dépendance :

configurations {
    ftpAntTask
} // pour spécifier que l'on ne veut pas l'ajouter dans le classpath d'eclipse mais bien dans le script

dependencies {
    ftpAntTask("org.apache.ant:ant-commons-net:1.9.4") {
        module("commons-net:commons-net:1.4.1") {
            dependencies "oro:oro:2.0.8:jar"
        }
    } // on ajoute la dépendance avec la configuration déclarée juste au-dessus
} // vous pouvez placer ce code dans le block dependencies déjà créé au préalable, moi je préfère le mettre à part pour organiser les choses

Il va nous falloir une fonction pour publier via ftp :

void ftp(Map args, Closure antFileset = {}) {
    ant {
        taskdef(name: 'ftp', classname: 'org.apache.tools.ant.taskdefs.optional.net.FTP', classpath: configurations.ftpAntTask.asPath) // On utilise la dépendance délcarée au-dessus
        Map ftpArgs = args + [
                                verbose : 'yes',
                                server  : privateConfig.ftp_adress, // on indique le serveur
                                userid  : privateConfig.ftp_user, // l'utilisateur
                                password: privateConfig.ftp_pw // le mot de passe
        ]
        delegate.ftp(ftpArgs) { // on exécute la commande
            antFileset.delegate = delegate
            antFileset()
        }
    }
}

Maintenant nous allons créer un repo maven local pour ensuite le publier via ftp, personnellement j’ai choisis de le mettre dans build/repo :

apply plugin: 'maven-publish' // on utilise le plugin maven-publish

publishing {
    publications {
        universal(MavenPublication) { // On publie le jar de base (ici universal n'a pas d'importance)
            artifact jar // on utilise l'archive jar
        }
        dev(MavenPublication) { // Si vous avez vu le bonus du tutoriel [Utiliser gradle pour gérer les dépendances](http://www.minecraftforgefrance.fr/showthread.php?tid=2689), vous pouvez publier la version déobfusquée
            artifact deobfJar
        }
        sources(MavenPublication) { // Et la version source (si vous voulez que gradle télécharge automatiquement les sources, il faut utiliser le classifier "sources")
            artifact sourceJar
        }
    }

    repositories {
        maven {
            url "$buildDir/repo" // on le publie en local
        }
    }
}

Et pour finir, il faut envoyer tout ça avec une tâche :

task upload(dependsOn: 'publish') << { // ici j'envoie dans le dossier repo de mon ftp
    ftp(action: 'mkdir', remotedir: "repo") // on crée le dossier où on va mettre les fichiers
    ftp(action: 'send', remotedir: "repo") { // On envoie les fichiers
        fileset(dir: "$buildDir/repo") // On envoie ceux du dossier repo
    }
}

Voilà ! Il ne vous reste plus qu’à faire gradlew build upload et tout sera publié !

D’accord c’est bien gentil ton truc mais comment on fait pour que gradle télécharge automatiquement mon mod avec les sources ?

Et bien comme dans mon dernier tutoriel, vous avez juste à ajouter ceci dans le block dependencies :

maven {
   name "<le nom de votre repo>"
   url "<l'url de votre site, chez moi : scarex.fr/repo>"
}

Voici ce à quoi devrait/pourrait ressembler votre fichier build.gradle :

// Config

ext.privateConfigFile = file 'private.properties'

privateConfigFile.withReader {
    def p = new Properties()
    p.load(it)
    project.ext.privateConfig = new ConfigSlurper().parse p
}

// Upload

configurations {
    ftpAntTask
}

dependencies {
    ftpAntTask("org.apache.ant:ant-commons-net:1.9.4") {
        module("commons-net:commons-net:1.4.1") {
            dependencies "oro:oro:2.0.8:jar"
        }
    }
}

void ftp(Map args, Closure antFileset = {}) {
    ant {
        taskdef(name: 'ftp',
                classname: 'org.apache.tools.ant.taskdefs.optional.net.FTP',
                classpath: configurations.ftpAntTask.asPath)
        Map ftpArgs = args + [
                                verbose : 'yes',
                                server  : privateConfig.ftp_adress,
                                userid  : privateConfig.ftp_user,
                                password: privateConfig.ftp_pw
        ]
        delegate.ftp(ftpArgs) {
            antFileset.delegate = delegate
            antFileset()
        }
    }
}

task mavenUpload(dependsOn: 'publish') << {
    ftp(action: 'mkdir', remotedir: "repo")
    ftp(action: 'send', remotedir: "repo") {
        fileset(dir: "$buildDir/repo")
    }
}

apply plugin: 'maven-publish'

publishing {
    publications {
        universal(MavenPublication) {
            artifact jar
        }
        dev(MavenPublication) {
            artifact deobfJar
        }
        sources(MavenPublication) {
            artifact sourceJar
        }
    }

    repositories {
        maven {
            url "$buildDir/repo"
        }
    }
}

Crédits

Rédaction :

Correction :

Creative Commons
Ce tutoriel de SCAREX publié sur Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

retourSommaire des tutoriels