La construction d'une .NET de Base application via la ligne de commande, de sorte qu'il fonctionne sur une machine sans .NET de Base installé
Mon objectif final est de créer une croix-plate-forme (non web) l'application de la console, donc je suis en train d'explorer .NET, Base droite maintenant.
Dans mon précédent .Projets NET, j'ai fait toutes les de développement à l'intérieur de Visual Studio, mais j'ai également créé un batch/MSBuild fichier afin que je puisse construire l'ensemble du projet (y compris les installations, les packages NuGet, des fichiers zip avec les fichiers binaires, etc.) avec un simple clic. Voici un exemple d'un projet précédent.
En fin de compte, je veux faire quelque chose de similaire avec mon .NET de Base d'un projet de test.
Mais pour l'instant je ne suis pas à la première étape: je ne suis pas en mesure de le construire en dehors de Visual Studio, de sorte que le résultat fonctionne sur un autre ordinateur Windows sans .NET de Base installé.
(dans la première étape, je suis ignorant la croix-plateforme - je serai heureux de l'obtenir pour fonctionner sur Windows)
Ce que j'ai
J'ai réussi à le faire fonctionner à l'intérieur de Visual Studio 2015 de la Communauté de l'Édition comme suit:
-
créer un nouveau projet dans Visual Studio: "Nouveau Projet" ⇒ "Web" ⇒ "Application Console (Package)"
-
créer un nouveau profil de publication à l'intérieur de Visual Studio ("Build" ⇒ "Publier" dans le menu).
Cela va créer un script PowerShell (et un fichier XML avec les paramètres)
Voici mon test du projet sur GitHub.
Quand je fais "Build" ⇒ "Publier" dans le menu à nouveau, Visual Studio apparemment exécute le script PowerShell à nouveau.
Le résultat est un peu plus de 90 MO, se compose de 825 fichiers en 598 dossiers, et ressemble à ceci:
Quand je copie sur une autre machine (Win 7 /.NET 4 installé /.NET de Base pas installé), il fonctionne.
Ce que j'ai essayé d'obtenir le même résultat en dehors de Visual Studio
1. dotnet publier
Cette réponse et cette réponse son comme je peux l'utiliser dnu publish
pour obtenir le même résultat via la ligne de commande.
Je comprends que pièces de .NET de Base sont toujours les cibles en mouvement, alors apparemment dnu
est dotnet
au lieu.
J'ai donc essayé d'exécuter dotnet publish
(et créé un fichier de commandes) pour elle:
dotnet publish "%~dp0\src\CoreTestVisualStudio" -c Release -r win7-x64 -o "%~dp0\release\cli"
Le résultat consiste en une .exe
fichier et un tas de Dll, seulement 25 fichiers et de 1,5 MO, le tout dans un seul dossier:
Évidemment le .NET de Base d'exécution est-ce qui manque ici, et comme prévu, cette application se bloque lorsque je tente de l'exécuter sur une machine sans .NET de Base installée (le même que celui mentionné ci-dessus).
2. Le script PowerShell à partir de la publication du profil
J'ai essayé d'exécuter le script PowerShell (qui a été créé quand j'ai créé le profil de publication) en dehors de Visual Studio, mais il a échoué parce que le script attend certains paramètres et je ne sais pas ce qu'à passer:
param($publishProperties, $packOutput, $nugetUrl)
Il y a aussi cette ligne dans le script:
# to learn more about this file visit http://go.microsoft.com/fwlink/?LinkId=524327
...mais le lien juste points de la page d'atterrissage de l' .NET Développement Web et des Outils de Blog.
TL;DR
Ce que je fais mal?
Je sais que la première version de .NET de Base se concentre principalement sur ASP.NET mais ce que j'ai compris, ASP.NET applications de Base sont juste la console apps, alors j'ai pensé à une base de console application serait de travailler maintenant.
D'autre part, la plupart des console application "mise en route" docs sont toujours portés disparus, donc c'est peut-être un peu trop tôt et dotnet publish
pour console applications n'est pas encore fini?
Edit après quelques jours: je suis penser que je fais rien de mal et que c'est un problème dans the.NET de Base outils de ligne de commande, donc je publié sur les outils de ligne de commande' issue tracker.
- Avez-vous vu cela? github.com/dotnet/cli/blob/master/Documentation/intro-to-cli.md Vous pouvez essayer d'exécuter
dotnet build
de générer des exécutables actifs. - Non, je n'ai pas vu cela avant. Il ne fonctionne pas pour moi, si. Tout d'abord,
dotnet build
n'existait pas sur ma machine. Puis j'ai installé la dernière version à partir de votre lien, et maintenantdotnet build
existe, mais déclenche une exception:Unhandled Exception: System.TypeLoadException: Could not load type 'Microsoft.DotNet.Tools.Compiler.CompilerCommandApp' from assembly 'dotnet-compile, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. at Microsoft.DotNet.Tools.Build.Program.Main(String[] args)
- Je devrais peut-être mieux déposer une question sur GitHub? J'ai posté la question ici parce que je pensais que je faisais quelque chose de mal, mais si
dotnet build
est la façon actuelle maintenant et il se bloque sur ma machine, je suppose que c'est effectivement un bug. - Je suis passé par un problème similaire à essayer de reproduire le Visual Studio Publier sur la ligne de commande. Pour moi, il manquait l'exécution de l'option. Voici un lien vers le valide moment de l'exécution valeurs: docs.microsoft.com/en-us/dotnet/core/rid-catalog
Vous devez vous connecter pour publier un commentaire.
Problème résolu!
Je l'ai posté sur le outil de suivi de l' .NET de Base outils de ligne de commande, et il s'est avéré que c'était un bug dans
dotnet publish
- il n'a pas de bundle, le C++ qui est nécessaire pour exécuter l'application compilée sur une machine sans .NET de Base installé.La solution temporaire a été d'installer le runtime C++.
La "vraie" solution a été faite dans une pull request il y a trois jours, qui est inclus dans le dernier programme d'installation maintenant.
Avec cette version,
dotnet publish
ne bundle le runtime C++, donc le résultat sera le travail sur une machine sans .NET de Base.Pour
dnu
:Il y a une option pour
dnu publish
appelé--runtime
qui spécifie le moteur d'exécution d'inclure lors de la publication. Vous devez utiliser la pleine exécution de nom avec la commande, par exemple:Pour
dotnet
:Vous n'avez pas besoin de spécifier le moment de l'exécution ou du cadre de versions -- par défaut,
dotnet publish
utilisera le cadre deproject.json
et l'exécution actuel de la saveur. Cependant, la la documentation stipule que:dotnet
, c'est--runtime
ou-r
ainsi. Mais je a utiliser dans le code dans ma question:-r win7-x64
win7-x64
est la seule valeur valide pour Windows. J'ai essayé le paramètre de votre édité réponse, et j'obtiens le message d'erreur suivant:'...\CoreTestVisualStudio' cannot be published for '<no framework provided>' 'dnx-clr-win-x86.1.0.0-rc1'
. En fournissant le cadre (dnxcore50
, comme dans le projet.json) n'aide pas non plus. Où avez - vous pulldnx-clr-win-x86.1.0.0-rc1
partir? Il n'a pas l'air comme les numéros de version que je vois quand je lancednvm list
.Microsoft.NETCore.Runtime
répertorié comme une dépendance dans votre projet.json? Selon la page que vous avez lié, il doit être référencé ou le moteur d'exécution ne sera pas livré.Microsoft.NETCore.Runtime
comme une dépendance (j'ai plus de lire ça), mais ça ne change rien. Le résultat est plus grand maintenant (162 fichiers, 25 MO), mais ne fonctionne toujours pas sur l'autre machine. BTW, le message d'erreur est "MSVCP140.dll missing", qui semble renvoyer à l'runtime C++. Alors peut-être la publication via Visual Studio semble bundle le C++ runtime ainsi (bien que je ne peux pas trouverMSVCP140.dll
dans la sortie)?