Des bonnes alternatives à Cygwin? - Cygwin ne prend pas en charge nativement en charge des applications Win32
Mise à jour 1/9/2014: TL;DR version: Aller en bas de ce post pour un moyen d'obtenir Cygwin pour être en mesure d'appeler les non-Cygwin programmes.
Après avoir passé le temps de faire quelques scripts bash qui se trouvent être de taille importante, des versions plus récentes de Cygwin ont brisé entre eux. Ces scripts d'appel en natif Win32 applications qui n'ont pas un lien avec Cygwin, ce qui n'est apparemment pas officiellement pris en charge par Cygwin.
C'est venu comme une surprise pour moi, comme depuis des années, j'étais sous l'impression que Cygwin peut être utilisé dans plus d'un environnement mixte qui combine à la fois natif non-Cygwin Win32 apps, et POSIX programmes à l'aide de la Cygwin couche de compatibilité. Mais apparemment, seule la couche de compatibilité POSIX est vraiment pris en charge, et si Win32 natif non-Cygwin apps de travail alors il est considéré comme une heureuse coïncidence.
J'ai trouvé ceci à partir d'une incompatibilité, j'ai couru dans exécuter des programmes compilés sur le .NET Framework à partir à l'intérieur de Cygwin. Ce bien fonctionner, mais a été brisé il y a quelques mois. Plus précisément, la sortie standard d'un .NET programme qui est transmise à tout autre programme Win32 l'entrée standard généralement en sorte que le récepteur programme Win32 pour obtenir une fin prématurée-de-fichier de signal parce que Cygwin est récemment passé le message des tuyaux à partir de l'octet tuyaux il y a quelques mois - et le message tuyaux semblent être incompatibles avec toute application réceptrice à l'aide de Visual C++ ou .NET Framework. C'est parce que .NET des questions null écrire sur la sortie standard, ce qui n'est passé à l'application réceptrice si un message tuyau est utilisé. L'application réceptrice lit correctement zéro octets, de sorte que pense qu'il est en fin de fichier. Le chef de projet ne semble pas considérer cela comme un réel problème, car ils ne semblent pas vraiment favorable à l'exécution non-Cygwin les programmes à partir de Cygwin (surprise!).
Pour citer le responsable du projet Christopher Faylor à partir de plusieurs e-mails sur la liste de diffusion:
Ce que vous voyez peut-être parce que Cygwin a été modifiée pour utiliser
message-type de tuyaux d'un couple de révisions ans. Cela ne va pas
changement. La modification a été adoptée pour résoudre un problème avec Cygwin programmes
et ceux sont évidemment notre priorité #1.Indépendamment de la façon dont beaucoup de gens l'utilisation de Visual C++ ou .NET ils sont vraiment
pas notre public cible. C'est agréable quand les choses fonctionnent pour les personnes qui
ne voulez pas utiliser les outils UNIX, mais ils ne sont pas notre objectif principal.
Résolution des problèmes pour les personnes qui veulent utiliser non Cygwin choses n'est pas
quelque chose que je trouve une haute priorité.De pipe.cc: Notez que l'écriture, à côté du tuyau est ouvert comme PIPE_TYPE_MESSAGE.
Cette semble pour mieux imiter Linux tuyau de comportement et de l'est
certainement nécessaire pour pty manipulation depuis fhandler_pty_master écrit
pour la pipe en morceaux, terminée par le caractère de saut de ligne lorsque le CANON est en mode
spécifié.Le commentaire ci-dessus montre une relation "et" ici. Type de Message
les tuyaux de reproduire plus fidèlement Linux (UNIX) tuyau de comportement ET sont certainement
requis pour le pty-s.Je suis d'accord avec James que les temps d'exécution sont probablement buggy MAIS j'ai aussi
acceptez que cygwin devrait être en mesure d'avoir une poignée de ces scénarios.Votre accord les uns avec les autres ne va pas avoir beaucoup
effet. Cygwin code source n'est pas modifiée par le vote.
Même si cette question est finalement fixée en quelque sorte - qui sait, ils pourraient se casser quelque chose d'autre dans 3 mois et pas soin de fixer la régression. Ils pourraient envisager un patch, mais il me faudrait un certain temps pour comprendre quelque chose qui fonctionne. Je pense que mon temps est mieux dépensé ailleurs, parce qu'il est clair qu'ils sont tout à fait prêts à casser la compatibilité avec Win32 natif des applications et vous ne voulez pas perdre plus de temps sur se Win32 applications. Donc je suppose que Cygwin ne devrait pas être considéré comme une plate-forme stable pour mixte Win32/Cygwin environnements - quelles sont mes options? Où dois-je commencer, qui permettrait d'éviter une réécriture complète en quelque chose d'autre que bash? Je n'utilisez pas plus de la base d'installation de Cygwin + base de scripts perl.
Mise à JOUR: Après la publication de cette question d'origine, ils ont finalement une nouvelle pipe_byte
drapeau dans le CYGWIN
variable d'environnement: regardez la documentation. Si ce drapeau est réglé, il va corriger le problème décrit ci-dessus. Lors de l'invocation d'un non-Cygwin Win32 programme, toujours assurez-vous que le pipe_byte
drapeau est réglé.
Cependant, depuis, j'ai découvert une incompatibilité avec .NET Framework 4.0 et Cygwin. Les versions précédentes de .NET Framework n'ont pas ce problème. J'ai évoqué la question d'abord sur la Cygwin liste de diffusion ici:
Tuyau de synchronisation et d'incompatibilité entre Cygwin et .NET Framework 4.0
Pas fructueux réponses, j'ai étudié et a trouvé que Cygwin est la création se chevauchent les tuyaux, ce qui provoque le problème. Notez que le fait d'essayer d'utiliser les non-chevauchement de l'API Win32 appels avec un superposé de la pipe n'est pas défini, et la plupart (tous?) Win32 non-Cygwin programmes n'utilisent pas les e/S avec chevauchement avec leur niveau de descripteurs de fichiers. J'ai soumis un patch qui crée un pipe_nooverlap
drapeau dans le CYGWIN
variable d'environnement qui empêche que cela se passe:
Patch pour désactiver éventuellement se chevauchent tuyaux
Malheureusement, ils ont rejeté le patch, de sorte que vous ne verrez jamais cela dans les principaux DLL Cygwin:
Re: Patch pour désactiver éventuellement se chevauchent tuyaux
Le raisonnement pour rejeter le patch:
- Il était implicite que je me suis cassé le signal de mise en œuvre dans Cygwin; je n'ai pas trouvé que cela soit le cas, comme des signaux utilisent encore se chevauchent tuyaux.
- Ils ne se sentent pas comme l'ajout d'une variable d'environnement drapeau, même si elle est apparemment la résolution des problèmes.
- Ils ne veulent pas le code de prise en charge qui a même l'option de non-chevauchement des tuyaux.
Avec le raisonnement et les attitudes de ce genre, je crains que je ne peux pas penser à une manière de changer le patch pour répondre à leurs exigences... ils semblent déterminés à interdire les non-chevauchement des tuyaux jamais utilisé. J'ai été en utilisant le patch pour un certain temps maintenant, et n'ont pas eu de problèmes avec elle. Aussi, je ne peux pas penser à toutes les situations que l' pipe_nooverlap
drapeau de la rupture (voir mon suivi de l'e-mail sur leur liste de diffusion), mais je l'ai laissé comme un drapeau, juste au cas où il ya des problèmes.
Donc, si vous voulez l'appeler non-Cygwin Win32 ou .NET Framework programmes à partir de Cygwin, vous devez effectuer les opérations suivantes:
- Appliquer mon patch à la source de tous Cygwin version que vous utilisez. Ne pas s'attendre à ce patch à montrer dans les prochains Cygwin versions.
- Définir la
pipe_byte
etpipe_nooverlap
de drapeaux dans leCYGWIN
variable d'environnement.
Cela fonctionne... pour le moment!!! Je poste dans ce cas, il aide à quelqu'un d'autre qui veut encore l'utiliser Cygwin pour certaines choses.
Vous devez vous connecter pour publier un commentaire.
La meilleure alternative que j'ai trouvé est Gow (Gnu Sous Windows).
C'est une alternative légère à Cygwin, environ 10 fois plus léger.
Autant que je sache, les 130 outils installés avec Gow sont régulièrement des applications Win32.
2016 Réponse
J'ai construit De trésorerie cette année, une croix-plate-forme de mise en œuvre de Linux les commandes en cours d'exécution sur Node.js.
Ce prend en charge à la fois globale des installations de chaque commande dans votre
path
, ou un shell interactif avec un support complet pour bash-like de syntaxe, commande de la tuyauterie, l'auto-complétion et de l'histoire.Cette en outre s'exécute win32 applications à l'intérieur de la coquille.
MSYS
Il y a peut être moins de "prise en charge" des paquets, vous devez installer les choses en main, mais il ne sera pas:
cygpath
est une non-solution, que vous ne pouvez pas toujours se fourrer dans)Et il est beaucoup mieux d'interopérabilité avec les applications windows.
Comme cygnal mon projet est de créer une modification de Cygwin, servant de support d'exécution de la bibliothèque pour les applications destinées à fonctionner en tant que natif des programmes Windows, externe suivant les conventions familier pour les utilisateurs de Windows.
L'idée est que vous pouvez utiliser Cygwin environnement pour développer, à l'aide de son par défaut de la chaîne: le même compilateur qui fait Cygwin exécutables.
Ensuite, vous pouvez déployer votre programme, comme cygnal programme par le regroupement avec la modification de
cygwin1.dll
de l', comme cygnal projet.Ceci est particulièrement utile pour les programmes qui ont beaucoup de POSIX dépendances et ont besoin d'un décemment riche en fonctionnalités, de bonne qualité POSIX mise en œuvre.
En revanche, dans l', comme cygnal projet, ce genre de chose est considéré comme un problème pour lequel une solution raisonnable seront fusionnés.
J'ai l'habitude d'utiliser cygwin principalement pour le serveur X11 fonctionnalité. Il est utile pour exécuter tous les outils sur un serveur distant et l'exportation de l'affichage local de cygwin. Je trouve que je peux obtenir la même chose en utilisant Xming serveur qui est beaucoup plus léger.