J'essaye d'écrire un système de plugin avec .NET Core, et l'une de mes exigences est de pouvoir distribuer la DLL du plugin avec ses dépendances à l'utilisateur pour l'installation.
Cependant, je ne peux pas comprendre comment inclure mes dépendances NuGet en tant qu'artefact de construction et les faire sortir dans le dossier de construction, sans avoir à les utiliser dotnet publish
comme un hack. Existe-t-il un moyen de le spécifier dans le fichier .csproj (fichier projet)?
dotnet publish
serait-il un hack? Incluez la commande dans votre fichier csproj en tant que script de post-génération.dotnet publish
jette tout le framework dans le dossier de publication, puisque j'écris un plugin, la majorité des fichiers ne sont pas nécessaires car le framework serait déjà chargé par le programme bootstrapper. Je recherche quelque chose de similaire au fonctionnement des builds sur .NET Framework.<CopyToOutputDirectory>Always</CopyToOutputDirectory>
dans votre csproj sur chacune des dll que vous souhaitez déplacer ne fait pas l'affaire? Peut-être combiné avec un<link>
nœud?<PackageReference/>
ne prend pas en charge<CopyToOutputDirectory>
.Réponses:
Vous pouvez l'ajouter à l'
<PropertyGroup>
intérieur de votre fichier csproj pour appliquer la copie d'assemblys NuGet à la sortie de construction:Cependant, notez que la sortie de construction (
bin/Release/netcoreapp*/*
) n'est pas censée être portable et distribuable, la sortie dedotnet publish
est. Mais dans votre cas, la copie des assemblys dans la sortie de construction est probablement très utile à des fins de test. Mais notez que vous pouvez également utiliser l'DependencyContext
API pour résoudre les DLL et leurs emplacements qui font partie du graphique de dépendance de l'application au lieu d'énumérer un répertoire local.la source
DependencyContext
? Comment puis-je l'utiliser pour trouver une DLL qui ne se trouve pas dans le répertoire de l'application? Où est-il de toute façon?Vous pouvez utiliser PostBuildEvent pour automatiser le déploiement du module lors de la construction.
Pour obtenir des assemblys NuGet dans le dossier de construction, ajoutez csproj de votre module
Définissez les fichiers de module que vous souhaitez utiliser avec Inclure / Exclure (modifiez le chemin si nécessaire)
Réinitialisez votre dossier de construction par défaut et ajoutez PostbuildEvent
J'inclus app_offline pour recycler l'application si elle est déjà en cours d'exécution pour éviter les erreurs de fichier en cours d'utilisation.
la source
Ajouter
n'a pas fonctionné, mais l'ajout de ceci au fichier .csproj Framework:
fait.
la source
J'ai "résolu" (créé une solution) ceci de manière plus simple.
En post build
pub
est le dossier dans lequel vous voulez que vos éléments publiés soient transférésREMARQUE: selon la version que
dotnet.exe
vous utilisez, la commande--no-build
peut ne pas être disponible.Par exemple, non disponible dans la v2.0.3; et disponible en v2.1.402. Je sais que VS2017 Update4 avait v2.0.3. Et Update8 a 2.1.x
Mettre à jour:
La configuration ci-dessus fonctionnera dans l'environnement de débogage de base, mais pour la mettre dans l'environnement de serveur / production de construction, il en faut plus. Dans cet exemple particulier que j'ai dû résoudre, nous construisons
Release|x64
etRelease|x86
séparément. J'ai donc pris en compte les deux. Mais pour prendre en charge ladotnet publish
commande post build , j'ai d'abord ajoutéRuntimeIdentifier
au fichier projet.Pourquoi j'en ai eu besoin et pourquoi vous pouvez vous en passer? J'en avais besoin car mon programme de construction est configuré pour intercepter l'avertissement MSB3270 et échouer la construction s'il apparaît. Cet avertissement dit: "hé, certains fichiers de vos dépendances sont de format incorrect". Mais vous souvenez-vous du but de cet exercice? Nous devons extraire les DLL de dépendance de package. Et dans de nombreux cas, cela n'a pas d'importance si cet avertissement est là, car après la construction de la publication ne se soucie pas. Encore une fois, c'est mon programme de construction qui se soucie. Donc, j'ai seulement ajouté
RuntimeIdentifier
2 configurations que j'utilise lors de la construction de production.Version complète du post
Explication: dotnet publish recherche
obj\Debug
ouobj\Release
. Nous ne l'avons pas pendant la construction car la compilation créeobj\x64\Release
ouobj\x86\Release
. Les lignes 1 et 2 atténuent ce problème. Dans la ligne 3, je disdotnet.exe
d'utiliser une configuration spécifique et un runtime cible. Sinon, quand c'est le mode de débogage, je ne me soucie pas des trucs d'exécution et des avertissements. Et dans la dernière ligne, je prends simplement mes dll et je les copie dans le dossier de sortie. Travail accompli.la source
dotnet publish "$(ProjectFileName)" -c Release --no-build -o bin\pub
xcopy "$(ProjectDir)pub\PostSharp.dll" "$(OutDir)"
En conjonction avec la réponse ci-dessus: cela fonctionne très bien dans la ligne de commande de l'événement post-build: dans Visual Studio. Il boucle sur une sélection de dll (System * .dll et Microsoft .dll) *, puis ignore la suppression de dll spécifiques. System.Data.SqlClient.dll et System.Runtime.Loader.dll
la source