„Rozwiązałem” to (stworzyłem obejście) w prostszy sposób.
W budowaniu postu
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
jest folderem, w którym chcesz umieścić swoje opublikowane rzeczy na postoju
UWAGA: w zależności od używanej wersji dotnet.exe
, polecenie--no-build
może nie być dostępne.
Na przykład niedostępne w wersji 2.0.3; i dostępny w wersji 2.1.402. Wiem, że VS2017 Update4 miał v2.0.3. A Update8 ma 2.1.x
Aktualizacja:
Powyższa konfiguracja będzie działać w podstawowym środowisku debugowania, ale aby umieścić ją w środowisku serwera kompilacji / środowisku produkcyjnym, potrzeba więcej. W tym konkretnym przykładzie, który musiałem rozwiązać, budujemy Release|x64
i Release|x86
osobno. Więc rozliczyłem się z obu. Aby jednak obsługiwać polecenie po kompilacji dotnet publish
, najpierw dodałem RuntimeIdentifier
do pliku projektu.
<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>
Dlaczego tego potrzebowałem i dlaczego możesz się bez niego obejść? Potrzebowałem tego, ponieważ mój program kompilacji jest ustawiony na przechwytywanie ostrzeżenia MSB3270 i niepowodzenie kompilacji, jeśli się pojawi. To ostrzeżenie mówi: „Hej, niektóre pliki w Twoich zależnościach mają niewłaściwy format”. Ale czy pamiętasz cel tego ćwiczenia? Musimy pobrać biblioteki DLL zależności pakietów. W wielu przypadkach nie ma znaczenia, czy jest to ostrzeżenie, ponieważ po kompilacji nie obchodzi. Ponownie, to jest mój program do kompilacji, który dba. Więc dodałem tylko RuntimeIdentifier
2 konfiguracje, których używam podczas kompilacji produkcyjnej.
Pełna kompilacja postu
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
Objaśnienie: dotnet Publishing wyszukuje obj\Debug
lub obj\Release
. Nie mamy tego podczas kompilacji, ponieważ build tworzy obj\x64\Release
lub obj\x86\Release
. Wiersze 1 i 2 łagodzą ten problem. W linii 3 mówię, dotnet.exe
aby użyć określonej konfiguracji i docelowego środowiska wykonawczego. W przeciwnym razie, gdy jest to tryb debugowania, nie obchodzą mnie rzeczy i ostrzeżenia w czasie wykonywania. W ostatniej linii po prostu pobieram moje biblioteki dll i kopiuję je do folderu wyjściowego. Zadanie wykonane.
dotnet publish
być włamaniem? Dołącz polecenie do pliku csproj jako skrypt po kompilacji.