Programing

프로젝트 콘 외부에있는 .csproj에 콘텐츠 파일 포함

lottogame 2020. 11. 3. 07:36
반응형

프로젝트 콘 외부에있는 .csproj에 콘텐츠 파일 포함


"C : \ Projects \ MyProject \"에있는 MyProject.csproj라는 C # 프로젝트가 있습니다. 이 프로젝트의 출력 디렉토리에 복사하려는 파일도 있습니다. 그러나 파일은 "C : \ MyContentFiles \"위치에 있습니다. 즉, 프로젝트 콘 내에 있지 않습니다. 이 디렉토리에는 하위 디렉토리도 있습니다. 디렉토리의 내용은 관리되지 않습니다. 그러므로 나는 그 아래에있는 모든 것을 포함해야합니다.

프로젝트에 '콘텐츠'로 포함하면 복사되지만 디렉토리 구조가 손실됩니다. 나는 다음과 같이했다.

<Content Include="..\..\MyContentFiles\**">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

이러한 파일 / 디렉터리를 디렉터리 구조가 유지 된 프로젝트의 출력 디렉터리에 재귀 적으로 복사하려면 어떻게해야합니까?


파일을 링크로 추가해야합니다.

  1. VS에서 프로젝트를 마우스 오른쪽 버튼으로 클릭합니다.
  2. 추가-> 기존 항목 ...
  3. 파일을 찾으십시오.
  4. 그것을 선택하고.
  5. 링크로 추가 (대화 상자의 추가 버튼에 드롭 다운).
  6. 파일의 속성을 열고 "출력 디렉터리로 복사"를 "항상 복사"로 설정합니다.

그러나 디렉토리 트리에 대해서는 할 수 없습니다.
대신이를 위해 빌드 후 작업을 작성해야합니다. 이것은 당신을 쳐다볼 샘플 입니다.


저는 @Dmytrii 가 한 손으로 바로 잡을 수 있다고 믿습니다 . "링크"기능을 사용하고 싶습니다.

그러나 그는 디렉토리 트리에 연결할 수 없다고 말할 때 부분적으로 만 정확합니다. 실제로 Visual Studio의 GUI를 사용하여 링크를 추가하려고 할 때 사실이지만 MSBuild는이를 지원합니다.

디렉토리 구조를 유지하려면 노드에 %(RecursiveDir)태그를 추가하기 만하면됩니다 <link>.

<Content Include="..\..\MyContentFiles\**\*.*">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

MSBuild Well-known Item Metadata 페이지 는 액세스 할 수있는 메타 데이터에 대해 자세히 설명합니다.


Mandark 의 대답은 콘텐츠 파일을 솔루션에 직접 추가하고 솔루션 탐색기에 표시됩니다. 원본 디렉토리에서 파일이 추가되거나 삭제 될 때마다 Visual Studio에서 자동으로 선택하지 않습니다. 또한 솔루션 탐색기에서 파일이 삭제되거나 추가 될 때마다 프로젝트 파일이 변경되고 폴더 만 포함하는 대신 모든 파일이 별도로 포함됩니다.

이를 방지하기 위해 동일한 트릭을 사용할 수 있지만 별도의 프로젝트 파일에 넣은 다음 가져옵니다.

프로젝트 파일 (예 : include.proj)은 다음과 같습니다.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Content Include="..\..\MyContentFiles\**">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

자신의 프로젝트 파일에 다음 줄을 추가하십시오.

<Import Project="include.proj" />

Visual Studio는이 파일을 엉망으로 만들지 않고 빌드 중에 파일을 콘텐츠로 추가합니다. 원래 디렉토리의 변경 사항은 항상 포함됩니다. 파일은 솔루션 탐색기에 표시되지 않지만 출력 디렉터리에 포함됩니다.

이 트릭에 대해 알아 보았습니다. http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx


프로젝트 파일 하단에 추가하는 다음은 빌드 후 이벤트의 디렉터리 구조를 유지하는 콘텐츠 파일을 빌드의 대상 디렉터리 $(TargetDirectory)(일반적으로 $(MSBuildProjectDirectory)\bin\Debug)에 복사합니다 .

<ItemGroup>
    <ExtraContent Include="$(MSBuildProjectDirectory)\..\..\MyContentFiles\**" />
</ItemGroup>

<Target Name="AfterBuild">
    <Copy 
        SourceFiles="@(ExtraContent)" 
        DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
        SkipUnchangedFiles="true" />
</Target>

이러한 파일이 MyContentFiles라는 디렉토리로 이동해야하는 경우 복사 전에 다음을 추가 할 수 있습니다.

<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " />

그리고 변경

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

나는 생각한다

<Content Include="..\..\MyContentFiles\**\*.*">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

그 폴더와 하위 폴더의 모든 것을 원하기 때문에 충분합니다.


To include files in a folder for a .NET Core project,

<ItemGroup>
  <None Update="..\..\MyContentFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

And the items' property "Copy to Output Directory" will be "Copy if newer":
Copy if newer


To ignore a file in a .Net Core project:

<ItemGroup>
 <Content Include="appsettings.local.json">
   <CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory>
 </Content>
</ItemGroup>

참고URL : https://stackoverflow.com/questions/1292351/including-content-files-in-csproj-that-are-outside-the-project-cone

반응형