Forum de la communauté SFML

Général => Suggestions de nouvelles fonctionnalités => Discussion démarrée par: ctxnop le Septembre 20, 2013, 02:28:55 pm

Titre: Paquet NuGet
Posté par: ctxnop le Septembre 20, 2013, 02:28:55 pm
Salut,
J'ai suivi avec attention l'évènement Going Native de cette année et j'y ai découvert que la gestion des bibliothèques via NuGet était maintenant possible pour les bibliothèques C et C++ (http://channel9.msdn.com/Events/GoingNative/2013/Find-Build-Share-Use-Using-NuGet-for-C-and-Cpp-Libraries).
Est-il prévu que la SFML distribue un tel paquet ?

Au passage, Herb Sutter à fait un peu de pub pour SFML (http://channel9.msdn.com/Events/GoingNative/2013/Keynote-Herb-Sutter-One-Cpp) (a environ 1h18).
Titre: Re : Paquet NuGet
Posté par: Laurent le Septembre 20, 2013, 02:41:24 pm
C'est pas prévu pour le moment, mais si quelqu'un souhaite le faire ce sera avec plaisir que rendrai ça officiel :)

Citer
Au passage, Herb Sutter à fait un peu de pub pour SFML (a environ 1h18).
Oui, je me suis inscrit sur la mailing list de discussion autour de l'API graphique 2D pour C++, et je vais essayer de participer si je peux, mais pour l'instant je suis encore assez perplexe concernant l'idée.

cf. http://en.sfml-dev.org/forums/index.php?topic=12789.0
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 20, 2013, 02:58:20 pm
Je ne suis pas familier de la création de paquets nuget pour le moment, mais j'envisage d'en faire pour utilisation interne dans ma boite (pour du C# par contre). Une fois que j'aurais joué un peu plus avec le système, si j'ai un peu de temps et que personne ne s'y est collé d'ici là, je verrai a tenter de créer un tel paquet. Mais bon, je ne promet vraiment rien.
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 21, 2013, 01:42:47 am
Bon finalement, en rentrant de soirée j'ai été voir comment créer un paquet nuget pour du c++ et bah... c'est pas bien dur. Donc je l'ai fait.

Voici le code de création du paquet :
nuget {
        nuspec {
                id = sfml;
        version : 2.1.0.0;
        title: SFML;
        authors: {Laurent Gomila};
        owners: {Laurent Gomila};
        licenseUrl: "http://www.sfml-dev.org/license.php";
        projectUrl: "http://www.sfml-dev.org";
        iconUrl: "http://www.sfml-dev.org/images/logo.png";
        requireLicenseAcceptance:false;
        summary: "SFML provides a simple interface to the various components of your PC, to ease the development of games and multimedia applications. It is composed of five modules: system, window, graphics, audio and network." ;

        description: @"SFML provides a simple interface to the various components
                of your PC, to ease the development of games and multimedia applications.
                It is composed of five modules: system, window, graphics, audio and network.

        With SFML, your application can compile and run out of the box on the most
                common operating systems: Windows, Linux, Mac OS X and soon Android & iOS.

        SFML has official bindings for the C and .Net languages. And thanks to its
                active community, it is also available in many other languages such as Java,
                Ruby, Python, Go, and more.
        ";
        releaseNotes: "Release of SFML 2.1 libraries.";
        copyright: Copyright 2013;
        tags: { sfml, native, CoApp };
    }
       
        files {
                #defines {
                        SRC = sources\;
                }
               
                include: { "${SRC}include\**" };
                docs: { "${SRC}doc\**" };
               
                [x86,v90,debug] {
                        bin: "${SRC}bin\x86\v90\debug\bin\*";
                        lib: "${SRC}bin\x86\v90\debug\lib\*";
                }
               
                [x86,v90,release] {
                        bin: "${SRC}bin\x86\v90\release\bin\*";
                        lib: "${SRC}bin\x86\v90\release\lib\*";
                }
               
                [x64,v90,debug] {
                        bin: "${SRC}bin\x64\v90\debug\bin\*";
                        lib: "${SRC}bin\x64\v90\debug\lib\*";
                }
               
                [x64,v90,release] {
                        bin: "${SRC}bin\x64\v90\release\bin\*";
                        lib: "${SRC}bin\x64\v90\release\lib\*";
                }
               
                [x86,v100,debug] {
                        bin: "${SRC}bin\x86\v100\debug\bin\*";
                        lib: "${SRC}bin\x86\v100\debug\lib\*";
                }
               
                [x86,v100,release] {
                        bin: "${SRC}bin\x86\v100\release\bin\*";
                        lib: "${SRC}bin\x86\v100\release\lib\*";
                }
               
                [x64,v100,debug] {
                        bin: "${SRC}bin\x64\v100\debug\bin\*";
                        lib: "${SRC}bin\x64\v100\debug\lib\*";
                }
               
                [x64,v100,release] {
                        bin: "${SRC}bin\x64\v100\release\bin\*";
                        lib: "${SRC}bin\x64\v100\release\lib\*";
                }
               
                [x86,v110,debug,desktop] {
                        bin: "${SRC}bin\x86\v110\debug\bin\*";
                        lib: "${SRC}bin\x86\v110\debug\lib\*";
                }
               
                [x86,v110,release,desktop] {
                        bin: "${SRC}bin\x86\v110\release\bin\*";
                        lib: "${SRC}bin\x86\v110\release\lib\*";
                }
               
                [x64,v110,debug,desktop] {
                        bin: "${SRC}bin\x64\v110\debug\bin\*";
                        lib: "${SRC}bin\x64\v110\debug\lib\*";
                }
               
                [x64,v110,release,desktop] {
                        bin: "${SRC}bin\x64\v110\release\bin\*";
                        lib: "${SRC}bin\x64\v110\release\lib\*";
                }
        }
       
        targets {
                Defines += HAS_SFML;
        }
}
 

Suffit de regarder le code ci-dessus pour déduire l'arbo que j'ai utilisé. (Tous les fichiers ont été obtenus en downloadant toutes les versions Visual Studio que tu proposes au téléchargement ici (http://www.sfml-dev.org/download/sfml/2.1/index-fr.php), il manque les symboles car tu ne les fournits pas).
Ce qui me donne deux paquets que j'héberge ici (home serveur, donc pas beaucoup de bande passante) :
sfml.2.1.0.0.nupkg (http://dl.nopping.fr/sfml.2.1.0.0.nupkg)
sfml.redist.2.1.0.0.nupkg (http://dl.nopping.fr/sfml.redist.2.1.0.0.nupkg)

Il faut impérativement prendre les deux !
Donc si ça te conviens on peut publier ça sur nuget.org. Dès que ce sera le cas je stopperai l'hébergement et les liens ci-dessus seront morts.

J'ai testé sur Visual Studio 2012 avec un projet console en debug/release en ciblant x86 et x64. Ca a l'air de bien fonctionner (vraiment génial d'ajouter ses dépendances comme ça en tout cas).

Quelques petites remarques :
- Ca serait cool de changer l'url du logo pour une version qui ne contient que "l'image", pas le texte "SFML". Parce que dans le gestionnaire de paquet ça rend pas terrible et SFML est déjà affiché vu que c'est le nom du paquet.
- Il faut impérativement >=NuGet-2.5. Sinon on ne peut installer le paquet que pour la solution et non le projet. Donc c'est quasi useless (il faut se taper toute la conf du projet à la main alors que c'est justement le but de NuGet d'éviter ça)
- Je n'ai pas réussit (pas vraiment cherché non plus) a permettre une configuration automatique du mode "statique". Mais je les inclus dans le paquet tout de même donc on peut changer ça à la main.
- Je n'ai pas géré les dépendances de SFML (libsndfile-1.dll et openal32.dll). Je les distribue avec le paquet tout comme toi. Idéalement il faudrait créer une dépendance vers des paquets nuget qui fourniraient ces dll. Je n'ai pas pris le temps de vérifier si ces paquets nuget existent.
- J'ai été obligé d'ajouter un fichier "SFML.hpp" dans le répertoire parent de celui contenant "Graphics.hpp" et autre. En effet, la commande qui génère le paquet ne conserve pas l'arborescence si je ne fais pas ça, du coup on doit faire #include <Graphics.hpp> au lieu de <SFML/Graphics.hpp>. Le fichier que j'ai ajouté se contente de faire un include SFML/*.hpp.
Si ça dérange je chercherai un moyen de le dégager tout en gardant la structure.

Voilà, je crois que c'est tout.
Titre: Re : Paquet NuGet
Posté par: Laurent le Septembre 21, 2013, 09:15:57 am
Génial :)

Citer
- Ca serait cool de changer l'url du logo pour une version qui ne contient que "l'image", pas le texte "SFML".
J'ai pas trop le temps en ce moment, vois si tu peux l'extraire de la version SVG.

Citer
- J'ai été obligé d'ajouter un fichier "SFML.hpp" dans le répertoire parent de celui contenant "Graphics.hpp" et autre. En effet, la commande qui génère le paquet ne conserve pas l'arborescence si je ne fais pas ça, du coup on doit faire #include <Graphics.hpp> au lieu de <SFML/Graphics.hpp>. Le fichier que j'ai ajouté se contente de faire un include SFML/*.hpp.
Si ça dérange je chercherai un moyen de le dégager tout en gardant la structure.
Oui ça me dérange un peu, les gens qui vont chopper SFML via NuGet auront / utiliseront un fichier qui n'existe pas dans la distribution officielle. S'ils distribuent leur code ça ne compilera même pas chez quelqu'un d'autre (s'ils incluent SFML.hpp).
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 21, 2013, 10:39:42 am
Oui c'est pas faux pour le sfml.hpp. comme dis dans mon message et comme l'heure le montre j'ai fais ça en rentrant de soirée.  Je n'ai pas pris le temps de chercher. C'est vraiment un premier jet. Je vais tenter de corriger dans la journée si jai un peu de temps.
Pas de problème pour extraire l'icône du svg mais il faudra l'héberger.
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 21, 2013, 11:46:21 am
Déjà, voila l'icone SFML sans le texte. J'ai fais une version SVG et une version png 128x128. J'utiliserai la version png dans le paquet nuget (je doute qu'un svg s'affiche correctement dans Visual Studio).
Pour le paquet nuget il va falloir attendre un peu, je ne suis pas chez moi ni sur le même ordi, il faut donc que j'installe les outils pour le créer, or le site est down pour le moment  :-\
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 21, 2013, 02:08:16 pm
Voilà, le site de CoApp est toujours down mais j'ai réussit à trouver l'url direct de download de l'outil qu'il me manquais. J'ai mis les paquets à jour. Ils sont dispo à la même adresse.

- J'ai viré le fichier SFML.hpp, je l'ai remplacé par un fichier vide nommé "delete.me". Quand le site de CoApp sera à nouveau en ligne je regarderai s'il y a moyen de se débarrasser totalement de ce fichier. En attendant ça ne devrait pas poser de problème vu que c'est un fichier vide et qu'il n'est ni un .h ni un .hpp.

- J'ai utilisé "http://www.sfml-dev.org/images/sfml-icon.png" comme url de l'icône, donc quand tu uploaderas l'icône ça sera pris en compte automatiquement, en attendant, tant que l'icône est introuvable, l'icône par défaut de NuGet est utilisée.

Faudrait aussi que tu jettes un coup d'oeil aux métadonnées du paquets (partie 'nuspec' du fichier que j'ai posté hier soir) histoire de vérifier si ça te conviens ou non.
Titre: Re : Paquet NuGet
Posté par: Laurent le Septembre 21, 2013, 07:29:29 pm
J'ai uploadé l'image.

Concernant les metadonnées, ça me paraît bon. Je n'ai pas vérifié le texte mais j'imagine que tu as juste collé la description officielle ;)
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 21, 2013, 07:44:21 pm
Tout à fait, j'ai copier/coller le texte de la page d'accueil de la page anglais.
En pièce jointe un petit screenshot de ce que ça donne dans Visual Studio.
Donc si tu es ok j'upload tout ça sur nuget.org
Titre: Re : Paquet NuGet
Posté par: Laurent le Septembre 21, 2013, 09:39:34 pm
Ca m'a l'air pas mal du tout :)

Attention : il y a un "for for" dans la description de SFML Redist.

Pour info : tout cela est compatible avec quelles versions de Visual Studio ? comment vont se passer les prochaines releases, tu serais ok pour faire les updates correspondant ?
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 21, 2013, 09:43:19 pm
Au moins 2010 et 2012. Mais il me semble que 2008 aussi il me semble. A confirmer.  Je corrigerais la description tout a l'heure et j'uploaderai tout ca....
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 21, 2013, 11:41:25 pm
Désolé, j'ai répondu avec mon téléphone tout à l'heure et du coup j'ai zapé la moitié du message.

Le coup du "for for" c'est l'outil de CoApp qui génère ça tout seul, faudra que je le leurs signale. J'ai trafiqué le paquet final à la main pour corriger en attendant.
J'ai uploadé le "sfml.redist", le "sfml" est en cours mais ma connexion n'a pas l'air de vouloir y mettre du sien...

Les futures updates se feront en gardant la structure. Il suffit de mettre les bons fichiers aux bons endroit, lancer la commande et uploader le résultat.
On pourrait voir à améliorer et automatiser un peu tout ça dans le future. Je pense qu'en jouant un peu avec cmake il doit y avoir moyen de tout faire d'un coup.

Pour les futures updates je veux bien m'y coller mais je ne peux garantir que j'aurais toujours le temps immédiatement. Donc si une petite latence entre la release "classique" et la release "nuget" ne te gènes pas, alors tu peux compter sur moi.
Dans le cas contraire, n'importe qui peut me remplacer, je te filerai un zip avec tout ce qu'il faut ainsi qu'une petite doc sur comment qu'on fait. Tu verra c'est très simple.
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 22, 2013, 12:05:20 am
Voilà, c'est en ligne, accessible à tous, la SFML 2.1 peut maintenant être installée et utilisée directement depuis Visual Studio grâce à NuGet \o/

https://www.nuget.org/packages?q=sfml
Titre: Re : Paquet NuGet
Posté par: Laurent le Septembre 22, 2013, 08:45:54 am
Bravo :D

Pour les prochaines releases, ça ne me gêne pas qu'il y ait un peu de latence. Du moment que quelqu'un s'en occupe, c'est déjà génial ;)
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 22, 2013, 10:04:20 am
Après m'être renseigné un peu plus, l'extension NuGet n'est disponible que pour Visual Studio 2010 et supérieur (dont la preview de 2013).
Donc pour 2008 ça tombe un peu à l'eau.
Cependant il semblerait qu'on puisse bidouiller pour faire passer NuGet tout de même. De plus il peut s'utiliser en dehors de Visual Studio, en stand alone ou via un autre outil qui le supporte (genre WebMatrix). Donc on peut potentiellement l'utiliser quand même.

Par contre je doute que dans ces cas on profite de la configuration automatique du projet. Ça se transformera sans doute en simple downloader.

Du coup je pense que dans les prochaines versions, si tu es d'accord, je n'inclurai pas les binaires pour Visual Studio antérieurs a 2010. Ça allègera le poids du paquet.
Titre: Re : Paquet NuGet
Posté par: Laurent le Septembre 22, 2013, 11:11:24 am
No problem.
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 22, 2014, 09:37:57 am
Bonjour,
Un an jour pour jour, jolie coïncidence...
Je te contacte car j'ai reçu une demande vis à vis du package nuget : le support de Visual Studio 2013.
Cette version n'étant pas disponible sur le site j'ai quelques des questions :

Je sais qu'en découpant le paquet en plusieurs on se retrouve avec une distribution différente de celle du site, cependant nuget est un système de résolution de dépendance, pas vraiment un système de téléchargement. Les gens s'attendent souvent à avoir un paquet par DLL/Assembly car on ajoute aux projet une "référence nuget" au même titre qu'on ajoute une référence à une assembly locale.
De plus, contrairement au site, nuget ne permet pas de télécharger que la bonne version de Visual Studio, il télécharge tout et configure pour utiliser la version correspondante au Visual Studio, ce qui donne des paquets très lourds à télécharger.
Titre: Re : Paquet NuGet
Posté par: Laurent le Septembre 22, 2014, 11:12:44 am
Citer
Est-ce que tu comptes mettre à dispo une version pour VS2013 ?
Non. Uniquement pour la prochaine release (SFML 2.2).

Citer
Si non, je peux compiler les sources, mais est-ce que tu compiles avec des options particulières pour les versions que tu proposes ? (histoire que je mette les mêmes)
Non. CMake avec les options par défaut te génère une release "officielle".

Citer
Si je compile, est-ce que tu voudra un zip pour mettre cette version dispo sur ton site ?
Non ;)

Note qu'on a déjà des nightly builds pour Visual Studio 2013, par contre je ne sais pas si on a SFML 2.1.

Citer
Pour le paquet nuget j'envisage un découpage en plein de sous-paquets (un pour sfml-graphics, un autre pour sfml-audio, etc...) est-ce que tu vois quelque chose qui pourrait s'opposer à ce découpage ?
Pas de souci, mais comment vas-tu gérer les dépendances entre modules ? Par exemple, si je prends le paquet sfml-audio et le paquet sfml-graphics, je n'aurais bien qu'une seule version de sfml-system ?

Citer
Pour gérer le SFML_STATIC je ne vois pas d'autre solution qu'un découpage avec un paquet static et un dynamique, ca te dérange ?
Non ça ne me dérange pas. Mais pourquoi ne pas mettre les deux dans un même paquet ?

Citer
Si tu es ok pour le découpage, j'aurais besoin d'avoir plus d'info sur les dépendances entre les modules
Tout dépend de sfml-system, et sfml-graphics dépend aussi de sfml-window.
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 22, 2014, 12:18:21 pm
Pour les dépendances normalement nuget se débrouille pas trop mal et donc oui, il y aura bien qu'un seul sfml-system si tu prend sfml-audio+sfml-graphics.
Évidemment je testerai que ça se comporte bien comme ça avant d'upload.

Pour la question de séparer les statiques des dynamiques c'est parce que nuget configure le projet (c'est tout son intérêt d'ailleurs).
Pour le moment il configure pour utiliser les dynamiques, c'est à dire qu'il n'ajoute pas SFML_STATIC au preprocesseur et fait un link vers les .lib "normaux".
La configuration est "injectée" dans le projet et n'est pas facile d'accès pour modifier si elle ne convient pas.
Du coup si on veut passer en static il faut beaucoup bidouiller, donc je pense que personne ne changera la config par défaut, celui qui veut utiliser les statiques aura plus simple de passer par le site.
De plus, dans la mesure où on est sensé faire soit du static soit du dynamique, mais pas les deux, c'est un peu dommage de télécharger les libs dynamique si on va faire du static, et vice versa.

Je n'ai pas encore fait d'essai sur la séparation statique/dynamique, donc pour le moment je n'en sais pas beaucoup plus.
J'aimerai bien un système qui permette de sélectionner correctement les .lib selon que SFML_STATIC est définit ou non, mais à priori nuget en est dépourvu :(
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 24, 2014, 12:15:20 am
Salut !
Je n'ai pas du tout eu le temps de m'occuper des paquets nugets hier, désolé.
J'ai donc tout fais ce soir.

On a maintenant un paquet par module et on est donc capable de ne prendre que le module audio par exemple. Les dépendances sont gérées correctement.
Pour essai j'ai fais un projet dans lequel j'ai installé uniquement "sfml-graphics", nuget à automatiquement ajouté system et window. Par la suite j'ai ajouté "audio", et nuget n'a pas dupliqué system. Donc ça à l'air de tourner plutôt pas mal.

Je n'ai pas fais la séparation en static/dynamique finalement car en me baladant dans la doc de CoApp je suis tombé sur comment gérer les deux dans le même paquet. Le seul truc que j'ignore pour le moment c'est comment l'utilisateur final peut choisir. Par défaut c'est dynamic.

J'ai upload les paquets, c'est donc prêt à utilisation.
Pour info, on dénombre pas loin de 700 downloads sur les anciens paquets.
Titre: Re : Paquet NuGet
Posté par: Laurent le Septembre 24, 2014, 08:05:44 am
Fantastique, merci :)
Titre: Re : Paquet NuGet
Posté par: ctxnop le Septembre 24, 2014, 12:15:19 pm
J'ai trouvé comment l'utilisateur peut choisir entre static et dynamic, il y a un noeud de configuration qui est apparut dans les propriétés du projet, cf la capture.

La bonne nouvelle est que SFML_STATIC est automatiquement définit quand on choisit l'option dans cette fenêtre.

Les mauvaises nouvelles c'est que, d'une part, l'utilisateur peut choisir du static pour sfml-graphics et du dynamique pour sfml-window, ce qui ne donnera pas un bon résultat.
D'autre part, mon essai ne compile pas...
Je n'ai pas le temps la de suite d'investiguer plus que ça. Peut être que ça vient de ma compilation de VS2013, peut être que ça viens de mauvaises options, peut être qu'il s'agit d'un foirage dans la construction du paquet... J'essaierai de voir ça rapidement.

Par contre, l'utilisation de la sfml dans sa forme DLL, ce qui est le cas par défaut, fonctionne bien (j'ai déjà eu des retours de deux personnes pour me dire que ça roule).
Titre: Re : Paquet NuGet
Posté par: ctxnop le Octobre 01, 2014, 12:43:25 am
Bon voilà, j'ai enfin eu le temps d'investiguer.
Bonne nouvelle : les paquets fonctionnent bien, il s'agit bien d'une configuration de Visual Studio.
En fait c'est l'histoire du /MT(d) vs /MD(d) comme quasiment toujours, sauf qu'il y a une fourberie supplémentaire...
En fait définir à /MT(d) dans la page d'option habituelle n'a aucun effet... Il faut définir cette option dans le noeud "Project Master Settings", visible dans ma capture, juste au dessus du noeud "Référenced Packages".
Je ne sais pas pourquoi ils ont fait ça comme ça plutôt que d'utiliser l'option normale...

Autre détail, les DLLs sont copiées dans le répertoire de sortie même si on à choisi le mode static. Ce qui est utile pour les dépendances qui restent des DLLs (genre libsndfile-1.dll), mais les DLLs de la sfml sont également copiées alors que ce n'est pas utile.
J'ai vérifié, c'est bien le static qui est utilisé, si on supprime les DLLs l'exe fonctionne toujours.
Par contre, je ne pense pas pouvoir changer le fait que nuget copie ces DLLs inutilement.

Et sinon, les paquets sont online depuis 1 semaine et on compte déjà une vingtaine d'utilisation :)
Titre: Re : Paquet NuGet
Posté par: ctxnop le Janvier 10, 2015, 05:37:00 pm
Bonjour,

J'ai mis à jour les paquets nuget pour la version 2.2.

Cependant je me suis un peu foiré, j'ai utilisé un ancien script moisi et n'ai vu l'erreur qu'après upload...
J'ai aussitôt désactivé les paquets mais je ne peux les supprimer ni les remplacer (limitations du site).
Du coup j'ai généré de nouveau paquets mais avec la version 2.2.0.1.
Je pense que ça ne posera pas de problèmes étant donné que tu n'utilises que 2 nombres pour les releases a priori.

J'en ai également profité pour mettre en ligne les scripts de création de paquets afin que d'autres puissent créer des paquets personnalisés ou autre : https://github.com/ctxnop/sfml-nuget (https://github.com/ctxnop/sfml-nuget).

Ne pas hésiter à me dire s'il y a des problèmes.

Et bonne année bien sur !