code

.NET Core 프로젝트를 가져와 NuGet 참조를 복사하여 출력을 빌드하는 방법은 무엇입니까?

codestyles 2020. 11. 1. 18:09
반응형

.NET Core 프로젝트를 가져와 NuGet 참조를 복사하여 출력을 빌드하는 방법은 무엇입니까?


.NET Core를 사용하여 플러그인 시스템을 작성하려고하는데 내 요구 사항 중 하나는 플러그인 DLL을 사용자에게 배포하여 설치할 수 있도록하는 것입니다. 그러나 NuGet 종속성을 빌드 아티팩트 dotnet publish로 포함하고 해킹 으로 사용할 필요없이 빌드 폴더에 출력하도록하는 방법을 알아낼 수 없습니다 . csproj에서 이것을 지정할 수있는 방법이 있습니까?


이를 <PropertyGroup>csproj 파일 내부에 추가 하여 NuGet 어셈블리를 빌드 된 출력에 강제로 복사 할 수 있습니다 .

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

그러나 빌드 출력 ( bin/Release/netcoreapp*/*)은 이식 가능하고 배포 할 수 없어야 dotnet publish합니다. 그러나 귀하의 경우 어셈블리를 빌드 출력에 복사하는 것은 테스트 목적으로 매우 유용 할 것입니다. 그러나 DependencyContextapi를 사용하여 로컬 디렉터리를 열거하는 대신 응용 프로그램 종속성 그래프의 일부인 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|x64Release|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

참고URL : https://stackoverflow.com/questions/43837638/how-to-get-net-core-projects-to-copy-nuget-references-to-build-output

반응형