Comment get.NET projets de base pour copier les références NuGet pour générer la sortie?

J'essaie 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 à utiliser dotnet publish comme un hack. Y a-t-il un moyen de le spécifier dans le csproj?

33
demandé sur denfromufa 2017-05-08 02:05:16

2 réponses

Vous pouvez ajouter ceci à un <PropertyGroup> dans votre fichier csproj pour imposer la copie des assemblys NuGet à la sortie construite:

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

Cependant, notez que la sortie de construction (bin/Release/netcoreapp*/*) n'est pas supposée être portable et distribuable, la sortie de dotnet publish est. Mais dans votre cas, copier les assemblys dans la sortie de construction est probablement très utile à des fins de test. Mais notez que vous pouvez également utiliser l'api DependencyContext 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.

52
répondu Martin Ullrich 2017-11-20 13:30:31

Vous pouvez utiliser PostBuildEvent pour automatiser le déploiement du module sur build.

Pour obtenir des assemblys NuGet dans le dossier de construction, ajoutez csproj de votre module

<PropertyGroup>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>

Définissez les fichiers de module que vous voulez en utilisant Include / Exclude (modifiez le chemin si nécessaire)

<ItemGroup>
    <ModuleFiles
      Include="$(TargetDir)*.dll"
      Exclude="$(TargetDir)System*.dll;$(TargetDir)Microsoft*.dll"
      DestinationPath="$(SolutionDir)src\MyProject\Modules\MyModule\%(Filename)%(Extension)">
    </ModuleFiles>
</ItemGroup>

Réinitialisez votre dossier de construction par défaut et ajoutez PostbuildEvent

<Target Name="PublishModule" AfterTargets="PostBuildEvent" Inputs="@(ModuleFiles)" Outputs="@(ModuleFiles->'%(DestinationPath)')">
    <WriteLinesToFile File="$(SolutionDir)src\[YOURAPP]\app_offline.htm" />
    <Copy SourceFiles="@(ModuleFiles)" DestinationFiles="@(ModuleFiles->'%(DestinationPath)')" />
    <Delete Files="$(SolutionDir)src\[YOURAPP]\app_offline.htm" />
</Target>

J'inclus app_offline pour recycler l'application si elle est déjà en cours d'exécution pour éviter les erreurs d'utilisation du fichier.

5
répondu Xeevis 2017-09-05 12:08:21