Ho "risolto" (creato una soluzione) questo in modo più semplice.
In post build
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
è la cartella in cui vuoi che le tue cose pubblicate vengano messe in scena
NOTA: a seconda della versione dotnet.exe
utilizzata, il comando --no-build
potrebbe non essere disponibile.
Ad esempio, non disponibile nella v2.0.3; e disponibile in v2.1.402. So che VS2017 Update4 aveva v2.0.3. E Update8 ha 2.1.x
Aggiornare:
La configurazione di cui sopra funzionerà nell'ambiente di debug di base, ma per metterla nel server di compilazione / ambiente di produzione è necessario di più. In questo particolare esempio che ho dovuto risolvere, costruiamo Release|x64
e Release|x86
separatamente. Quindi ho tenuto conto di entrambi. Ma per supportare il dotnet publish
comando post build , ho prima aggiunto RuntimeIdentifier
al file di progetto.
<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>
Perché ne avevo bisogno e perché puoi farcela senza? Ne avevo bisogno perché il mio programma di compilazione è impostato per intercettare l'avviso MSB3270 e fallire la compilazione se viene visualizzato. Questo avviso dice "ehi, alcuni file nelle tue dipendenze hanno un formato sbagliato". Ma ricordi l'obiettivo di questo esercizio? Dobbiamo estrarre le DLL delle dipendenze dei pacchetti. E in molti casi non importa se questo avviso è presente perché dopo la compilazione del post non interessa. Ancora una volta, questo è il mio programma di compilazione che si preoccupa. Quindi, ho aggiunto solo RuntimeIdentifier
a 2 configurazioni che uso durante la build di produzione.
Creazione post completa
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
Spiegazione: dotnet publish sta cercando obj\Debug
o obj\Release
. Non lo abbiamo durante la compilazione perché build crea obj\x64\Release
o obj\x86\Release
. Le righe 1 e 2 attenuano questo problema. Nella riga 3 dico dotnet.exe
di utilizzare la configurazione specifica e il runtime di destinazione. Altrimenti, quando questa è la modalità di debug, non mi interessano le cose e gli avvisi di runtime. E nell'ultima riga prendo semplicemente i miei dll e li copio nella cartella di output. Lavoro fatto.
dotnet publish
sarebbe un hack? Includere il comando nel file csproj come script di post build.