.NET Core 프로젝트를 가져와 NuGet 참조를 복사하여 출력을 빌드하는 방법은 무엇입니까?
.NET Core를 사용하여 플러그인 시스템을 작성하려고하는데 내 요구 사항 중 하나는 플러그인 DLL을 사용자에게 배포하여 설치할 수 있도록하는 것입니다. 그러나 NuGet 종속성을 빌드 아티팩트 dotnet publish
로 포함하고 해킹 으로 사용할 필요없이 빌드 폴더에 출력하도록하는 방법을 알아낼 수 없습니다 . csproj에서 이것을 지정할 수있는 방법이 있습니까?
이를 <PropertyGroup>
csproj 파일 내부에 추가 하여 NuGet 어셈블리를 빌드 된 출력에 강제로 복사 할 수 있습니다 .
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
그러나 빌드 출력 ( bin/Release/netcoreapp*/*
)은 이식 가능하고 배포 할 수 없어야 dotnet publish
합니다. 그러나 귀하의 경우 어셈블리를 빌드 출력에 복사하는 것은 테스트 목적으로 매우 유용 할 것입니다. 그러나 DependencyContext
api를 사용하여 로컬 디렉터리를 열거하는 대신 응용 프로그램 종속성 그래프의 일부인 DLL 및 해당 위치 를 확인할 수도 있습니다 .
PostBuildEvent를 사용하여 빌드시 모듈 배포를 자동화 할 수 있습니다.
빌드 폴더에서 NuGet 어셈블리를 가져 오려면 모듈의 csproj 에 추가 하세요.
<PropertyGroup>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
Include / Exclude를 사용하여 원하는 모듈 파일을 정의합니다 (필요에 따라 경로 수정).
<ItemGroup>
<ModuleFiles
Include="$(TargetDir)*.dll"
Exclude="$(TargetDir)System*.dll;$(TargetDir)Microsoft*.dll"
DestinationPath="$(SolutionDir)src\MyProject\Modules\MyModule\%(Filename)%(Extension)">
</ModuleFiles>
</ItemGroup>
빌드 폴더를 기본값으로 재설정하고 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>
파일 사용 오류를 방지하기 위해 이미 실행중인 경우 앱을 재활용하기 위해 app_offline을 포함합니다.
첨가
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
작동하지 않았지만 Framework .csproj 파일에 다음을 추가하십시오.
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
했다.
나는 이것을 더 간단한 방법으로 "해결"(해결책을 만들었다).
빌드 후
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
게시 된 항목을 스테이징 할 폴더입니다.
참고 :dotnet.exe
사용 하는 버전에 따라 명령을 사용 --no-build
하지 못할 수 있습니다.
예를 들어 v2.0.3에서는 사용할 수 없습니다. v2.1.402에서 사용할 수 있습니다. VS2017 Update4에 v2.0.3이 있다는 것을 알고 있습니다. 그리고 Update8에는 2.1.x가 있습니다.
최신 정보:
위의 설정은 기본 디버그 환경에서 작동하지만 빌드 서버 / 프로덕션 환경에 배치하려면 더 많은 것이 필요합니다. 내가 해결해야한다고 위의 예에서, 구축 Release|x64
및 Release|x86
별도. 그래서 저는 둘 다 설명했습니다. 하지만 빌드 후 dotnet publish
명령 을 지원하기 위해 먼저 RuntimeIdentifier
프로젝트 파일에 추가 했습니다.
<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>
Why I needed it and why you can get away without it? I needed this because my build program is set to intercept warning MSB3270, and fail the build if it appears. This warning says, "hey, some files in your dependencies are of wrong format". But do you remember the goal of this exercise? We need to pull package dependency DLLs. And in many cases it doesn't matter if this warning is there because following post build does not care. Again, this is my build program that cares. So, I only added RuntimeIdentifier
to 2 configurations I use during production build.
Full Post build
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
Explanation: dotnet publish is looking for obj\Debug
or obj\Release
. We don't have it during the build because build creates obj\x64\Release
or obj\x86\Release
. Line 1 and 2 mitigate this issue. In line 3 I tell dotnet.exe
to use specific configuration and target runtime. Otherwise, when this is debug mode, I don't care about runtime stuff and warnings. And in the last line I simply take my dlls and copy then into output folder. Job done.
In conjunction with the above answer: I've got this working great in the Post-build event command line: in Visual Studio. It loops over a selection of dlls (System*.dll and Microsoft.dll)*, and then skips the deletion of specific dlls. System.Data.SqlClient.dll and System.Runtime.Loader.dll
for %%f in ($(OutDir)System*.dll $(OutDir)Microsoft*.dll) do if not %%f == $(OutDir)System.Data.SqlClient.dll if not %%f == $(OutDir)System.Runtime.Loader.dll del %%f
'code' 카테고리의 다른 글
@ 1x, @ 2x 및 @ 3x iOS 이미지가 필요한 이유는 무엇입니까? (0) | 2020.11.01 |
---|---|
반응에서 얕은 비교는 어떻게 작동합니까? (0) | 2020.11.01 |
ITextSharp 기존 PDF에 텍스트 삽입 (0) | 2020.11.01 |
Javascript / DOM : DOM 개체의 모든 이벤트를 제거하는 방법은 무엇입니까? (0) | 2020.11.01 |
Rails의 기본 레이크 작업 재정의 (0) | 2020.11.01 |