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


85

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

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

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

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

답변:


55

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

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

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


8
이 답변 에서 언급했듯이 "디렉토리 트리에 대해서는 할 수 없습니다." 진술은 사실이 아닙니다.
Mandark 2013-06-13

160

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

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

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

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

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


1
1) 파일이 공유 자산 저장소에서 삭제되면 어떻게됩니까? Solution Dir에서 삭제되지 않는 것 같습니다. 2) Visual Studio가 실행이 완료된 후 $ (SolutionDir)에서 이러한 파일을 삭제하도록 할 수있는 방법이 있습니까? 그대로두면 다른 개발자를 혼동 할 수 있습니다.
Adam

내 대답은 아래를 참조 @ 아담
Knaap 데르 로빈 반을

8
음식과 물이 거의없고 교제에 대한 강한 욕구를 가지고 광야에서 추락 한이 답변이 도움이된다는 것을 알게되었습니다. 이 지침에 따라 저는 한때 이곳 황야에서 나를 괴롭혔던 모든 인간의 요구를 대체하는 완전한 기능의 AI를 구축 할 수있었습니다. 감사합니다 Mandark!
deepelement

1
@Vijay는 내 편집을 참조하십시오 . 경로 끝 부분에 <Content Include="..\..\MyContentFiles\**\*.*">유의하십시오 \*.*.
CAD 블로크

2
VS2017 (15.8.6)의 .NET Core 프로젝트에서 작동하지 않습니다.
zwcloud

29

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


1
어떤 이유로 .proj 파일을 사용하면 작동하지 않는 것 같았지만 .csproj 파일로 작동하도록 만들 수있었습니다.
StriplingWarrior 2014 년

6
Content 요소에 <Visible> true </ Visible>을 추가하여 솔루션 탐색기에 항목을 표시 할 수 있습니다.
Michael Baker

광산 그냥 .proj으로 확인했다
제이슨 Dufair

이것은 저에게 전혀 효과가 없었으며 링크 될 항목이 사전 빌드 이벤트에서 생성 되었기 때문이라고 가정합니다.
Paul K

2
VS2017 (15.8.6)의 .NET Core 프로젝트에서 작동하지 않습니다.
zwcloud

10

프로젝트 파일 하단에 추가하는 다음은 빌드 후 이벤트의 디렉터리 구조를 유지하는 콘텐츠 파일을 빌드의 대상 디렉터리 $(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" />

1
변환에는 type-o가 있습니다. @ (ExtraContent)-> '...')는 @ (ExtraContext-> '...') 여야합니다. 그렇지 않으면 좋은 대답입니다!
alexdej 2010 년

@Todd 1) MyContentFiles 저장소에서 파일이 삭제되면 어떻게됩니까? Solution Dir에서 삭제되지 않는 것 같습니다. 2) Visual Studio가 실행이 완료된 후 $ (SolutionDir)에서 이러한 파일을 삭제하도록 할 수있는 방법이 있습니까? 그대로두면 다른 개발자를 혼동 할 수 있습니다.
Adam

3

나는 생각한다

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

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


2

.NET Core 프로젝트 용 폴더에 파일을 포함하려면

<!--Just files-->
<ItemGroup>
  <None Update="..\..\MyContentFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>
<!--Content files-->
<ItemGroup>
  <Content Include="..\..\MyContentFiles\**\*.*" Link="MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

그리고 항목의 속성 "출력 디렉터리로 복사"는 "최신 인 경우 복사"가됩니다.
최신 인 경우 복사


-1

.Net Core 프로젝트에서 파일을 무시하려면 :

<ItemGroup>
 <Content Include="appsettings.local.json">
   <CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory>
 </Content>
</ItemGroup>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.