J'ai "résolu" (créé une solution) ceci de manière plus simple.
En post build
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
est le dossier dans lequel vous voulez que vos éléments publiés soient transférés
REMARQUE: 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
et Release|x86
séparément. J'ai donc pris en compte les deux. Mais pour prendre en charge la dotnet publish
commande post build , j'ai d'abord ajouté RuntimeIdentifier
au fichier projet.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>
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
if not exist "$(ProjectDir)obj\$(ConfigurationName)" mkdir "$(ProjectDir)obj\$(ConfigurationName)"
xcopy "$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)" "$(ProjectDir)obj\$(ConfigurationName)" /E /R /Y
if $(ConfigurationName) == Release (
dotnet publish "$(ProjectFileName)" --runtime win-$(PlatformName) --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
) else (
dotnet publish "$(ProjectFileName)" --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
)
xcopy "$(ProjectDir)pub\my3rdPartyCompany.*.dll" "$(OutDir)" /Y /R
Explication: dotnet publish recherche obj\Debug
ou obj\Release
. Nous ne l'avons pas pendant la construction car la compilation crée obj\x64\Release
ou obj\x86\Release
. Les lignes 1 et 2 atténuent ce problème. Dans la ligne 3, je dis dotnet.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.
dotnet publish
serait-il un hack? Incluez la commande dans votre fichier csproj en tant que script de post-génération.