Apache ant


  • Moddeurs confirmés Rédacteurs Administrateurs

    Salut,

    Comme promit dans le tutoriel précédant sur git & github, nous allons voir dans ce tutoriel comment installer et utiliser apache ant pour automatiser les tâches pour réaliser votre mod. Grâce a ant, vous n'aurez plus besoin de vous embêter à lancer le script recompile, puis reobfuscate_srg, à faire l'archive, et a ajouter dans l'archive les textures. Tout va se faire en une commande.

    Prérequis

    Vous devez avoir votre mod dans un dossier sous la même organisation que celle donné à la fin du tutoriel sur git & github. Même si vos mods ne sont pas open source, que vous n'avez pas de compte github, suivez le même schéma.

    Téléchargement et installation

    Rendez-vous sur le site de apache pour télécharger ant
    Prenez une des trois archives, rien ne change sauf le format de compression. Ensuite décompressez l'archive, peu importe où. (personnellement, j'ai l'ai mit dans mon C:\Program Files (x86) sur mon Windows)
    Ensuite vous devez ajouter ant à la variable path. Pour ça, copier le chemin du dossier bin de ant (C:\Program Files (x86)\apache-ant-1.9.2\bin\ dans mon cas) et suivez les mêmes instructions que pour java (sous mac, suivez les instructions pour linux/solaris, MAC OS X étant basé sous UNIX comme solaris (et linux est basé sous le projet GNU qui est une "copie" de UNIX) cela fonctionnera aussi).
    Si vous êtes sous debian/ubuntu/autres distribution basé sous debian, ne vous embêtez pas, le paquet ant est disponible dans les ppa, et configure automatiquement la variable PATH

    Une fois installer, vérifiez que ça fonctionne en ouvrant le terminal / l'invite de commande, et tapez ant. Si vous avez

    Buildfile: build.xml does not exist!
    Build failed
    

    ça fonctionne !
    Sinon si vous avez commande non reconnu, c'est que vous avez mal configuré votre variable PATH.

    #Fonctionnement de ant(Fonctionnement de ant)

    Lorsque vous lancer ant, le logiciel va chercher un fichier build.xml dans le répertoire actuel. Ensuite, il va exécuter la cible que vous avez mit en argument (exemple "ant build" va lancer la cible build). Si vous ne mettez pas d'argument, il va lancer la cible par défaut.
    Le fichier xml ressemble à ça :

    <project name="Nom du projet" default="action par défaut">
    </project>
    

    Une cible :

    <target name="Nom de l'action">
    </target>
    

    Ensuite dans ces différents target, on met des commandes. Ces commandes se trouve sur la doc de ant :
    http://ant.apache.org/manual/index.html -> Ant tasks -> List of Tasks. Il y en a beaucoup, c'est pourquoi je vais vous expliquer les plus essentiel, et vous donner un exemple de build.xml tout fait.

    Exemple de build.xml

     <?xml version="1.0" ?>
    <project name="Tutoriel" default="build">
    
        <property file="build.properties" prefix="buildprop"/>
        <property name="forge.dir" value="..\forge"/>
        <property name="mcp.dir" value="${forge.dir}\${buildprop.forge}\mcp"/>
        <available property="mcp-exists" file="${mcp.dir}"/>
    
        <!-- Download and setup forge -->
        <target name="download-and-setup-forge" unless="mcp-exists">
            <propertyfile file="build.properties">
                <entry key="mc" type="string" default="error"/>
            </propertyfile>
            <propertyfile file="build.properties">
                <entry key="forge" type="string" default="error"/>
            </propertyfile>
            <property name="forge.name" value="minecraftforge-src-${buildprop.mc}-${buildprop.forge}.zip"/>
    
            <get src="http://files.minecraftforge.net/${forge.name}" dest="..\" usetimestamp="True"/>
    
            <!-- setup -->
            <mkdir dir="..\forgetemp"/>
            <unzip dest="..\forgetemp" src="..\${forge.name}"/>
            <mkdir dir="${forge.dir}\${buildprop.forge}\"/>
            <move todir="${forge.dir}\${buildprop.forge}\">
                <fileset dir="..\forgetemp\forge">
                </fileset>
            </move>
    
            <delete dir="..\forgetemp"/>
            <delete file="..\${forge.name}"/>
    
            <!-- Fix executable permissions -->
            <chmod dir="${forge.dir}/${buildprop.forge}" perm="ugo+rx" includes="**.sh"/>
    
            <!-- Install forge -->
            <exec dir="${forge.dir}/${buildprop.forge}" executable="cmd" osfamily="windows">
                <arg line="/c install.cmd"/>
            </exec>
    
            <exec dir="${forge.dir}/${buildprop.forge}" executable="sh" osfamily="unix">
                <arg value="install.sh"/>
            </exec>
        </target>
    
        <!-- Copy source into mcp -->
        <target name="copy_sources">
            <copy todir="${mcp.dir}\src\minecraft">
                <fileset dir="tutoriel_common\" />
            </copy>
        </target>
    
        <!-- Replace version token -->
        <target name="replace_tokens">
            <replace file="${mcp.dir}\src\minecraft\modtutoriel\common\ModTutoriel.java" token="@VERSION@" value="${buildprop.mod_version}" />
        </target>
    
        <!-- Recompile -->
        <target name="recompile">
            <exec dir="${mcp.dir}" executable="cmd" osfamily="windows"> 
                <arg line="/c recompile.bat" />
            </exec>
            <exec dir="${mcp.dir}" executable="bash" osfamily="unix">
                <arg line="recompile.sh" />
            </exec>
        </target>
    
        <!-- Reobfuscate -->
        <target name="reobfuscate">
            <exec dir="${mcp.dir}" executable="cmd" osfamily="windows">
                <arg line="/c reobfuscate_srg.bat" />
            </exec>
            <exec dir="${mcp.dir}" executable="bash" osfamily="unix">
                <arg line="reobfuscate_srg.sh" />
            </exec>
        </target>
    
        <!-- Build the jar -->
        <target name="makejar">
            <mkdir dir="dist\" />
            <jar destfile="dist\ModTutoriel-universal-${buildprop.mod_version}-mc${buildprop.mc}.jar">
                <fileset dir="${mcp.dir}\reobf\minecraft" />
                <fileset dir="tutoriel_resources\">
                    <include name ="assets\modtutoriel\**" /> 
                    <exclude name ="assets\modututoriel\**.db" /> 
                </fileset>
            </jar>
        </target>
    
        <!-- Clean up the MCP source now that we are done -->
        <target name="clean">
            <delete dir="${mcp.dir}\src\minecraft\modtutoriel\" />
            <delete dir="${mcp.dir}\reobf\minecraft" />
        </target>
    
        <target name="build">
            <!-- Prep for the build -->
            <antcall target="download-and-setup-forge" />
            <antcall target="copy_sources" />
            <antcall target="replace_tokens" />
            <antcall target="recompile" />    
            <antcall target="reobfuscate" />
            <antcall target="makejar" />
            <antcall target="clean" />
        </target>
    </project>
    

    build.properties est un second fichier :

    mc=1.6.4
    forge=9.11.1.953
    mod_version=1.0.0
    

    Explication :
    Par défaut l'action build est lancé. Cette action va lancer download-and-setup-forge, qui va télécharger et installer forge si forge n'existe pas. Cette version de forge sera stocké dans le dossier où vous avez tous vos projets, et sera utilisé uniquement pour la compilation.
    Ensuite il va copier le dossier le contenu de dossier tutoriel_common (mon dossier où il y a toutes mes sources) dans le dossier de mcp.
    Puis il va remplacer dans le fichier ${mcp.dir}\src\minecraft\modtutoriel\common\ModTutoriel.java tous les @VERSION@ par la version de mon mod qui se trouve dans build.properties.
    En fonction de l'os, il va lancer soit recompile.bat soit le .sh puis reobfuscate_srg.bat, soit le .sh.
    Après, il va créer le .jar du mods, en incluant tous ce qu'il y a dans reobf/minecraft, et tous les fichiers dans tutoriel_resources sauf les fichiers .db (évite les fichiers temporaire de windows Thumbs.db)
    Et pour finir, il supprime les fichiers de votre mods qui ont été mit dans mcp, ainsi mcp est prêt pour compiler un autre mod.
    Le jar de votre mod sera dans le dossier de votre projet/dist (vous pouvez changez le nom, ça importe peu)
    Pensez ajouter se dossier dans le .gitignore si c'est un projet git, ce n'est pas bon de commité des gros fichiers.

    Si vous voulez build un plugins FML, vous pouvez utiliser manifestencoding="UTF-8" manifest="chemin/vers/le/fichier/MANIFEST.MF" en paramètre de la fonction jar pour mettre un fichier MANIFEST.MF différent.

    Il est également possible de faire un système de numéro de build :

    <!-- Build Number -->
        <target name="increment_build_number">
            <propertyfile file="build.properties">
            <entry key="build_number" type="int" operation="+" default="1"/>
            </propertyfile>
        </target>
    

    Et dans la cible build, ajoutez :

    <antcall target="increment_build_number" />
    

    Après download-and-setup-forge.

    Questions / Réponses

    Q : J'obtiens un warning quand je lance ant : Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre7\lib\tools.jar

    R : Il faut configurer la variable JAVA_HOME (de la même façon que la variable path). Il y a de forte chance que cette variable n'existe pas encore, vous devez donc la créer. La valeur doit pointer vers le dossier de votre JDK (exemple : C:\Program Files\Java\jdk1.7.0_45)


  • Modérateurs

    Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre7\lib\tools.jar
    Buildfile: build.xml does not exist!
    Build failed
    

    Dis-moi, c'est normal pour la 1ère ligne?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Sous ubuntu avec l'installation de ant via le ppa j'ai pas ce message, par contre il me semble que sous mon W7 je l'ai aussi, je vérifie ça après.


  • Modérateurs

    Justement, je suis sous Windows 7.


  • Moddeurs confirmés Rédacteurs Administrateurs

    En effet, j'avais la même erreur, mais ça fonctionne quand même.
    Si tu veux la recorriger, le problème est que la variable JAVA_HOME n'est pas défini. Il faut suivre la même manipulation que pour ajouter dans la variable PATH, sauf que tu créer une nouvelle variable. Donc :
    Démarrer -> clic droit sur Ordinateur -> propriétés -> Paramètre système avancés -> Onglet du même nom -> Variable d’environnement -> Nouvelle … -> Nom de la variable : JAVA_HOME, Valeur de la variable : C:\chemin\vers\le\dossier\de\ton\jdk (C:\Program Files\Java\jdk1.7.0_45\ par exemple)
    Il faut mettre à jour cette variable à chaque maj du JDK de java.


  • Modérateurs

    Ok, problème résolu pour ma part. Mais, tu devrais peut être le préciser dans le tuto.


  • Moddeurs confirmés Rédacteurs Administrateurs

    Oui, je vais le mettre quand question / réponse 😉
    De toute façon cette erreur ne dérange pas, je l'ai depuis le début j'avais jamais fait attention x)


  • Modérateurs

    Dis-moi, ça te dérange, si je m'inspire du build.xml et du build.properties du Nanotech_mod?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Non, ça dérange pas de tout. Mais celui de nanotech_mod est prévu pour les variables jenkins, je fais finir le tutoriel dans la soiré normalement.


  • Modérateurs

    C'est le ${env.BUILD_NUMBER} qui correspond à Jenkins? J'ai déjà adapter le build.xml, pour qu'il correspond à mon mod.


  • Moddeurs confirmés Rédacteurs Administrateurs

    Oui.


  • Modérateurs

    Tu vas faire un tuto sur Jenkins ou pas? Voici mon build.xml, pour info, https://github.com/TheGenerationModers/Ere_Geologique/blob/master/build.xml

    Au passage, c'est normal que la shootbox est disparue?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Jenkins je sais pas, c'est plutôt compliqué à configurer, et il faut un serveur dédié (car en local c'est pas très pratique)
    Il me semble que ton mod utilise aussi buildcraft non ?
    Car il faut mettre toutes les dépendances.

    Finalement je vais pas pouvoir finir le tutoriel se soir, j'étais occupé sur d'autres trucs.


  • Modérateurs

    J'ai mis tous les api src dans le dossier external_api, mais je suis obligé de les mettre à jour manuellement, sachant que BuildCraft a également un système de build.


Log in to reply