MSBuild 복사, 임베드 질문입니다.

  1. 메인 프로젝트와 참조중인 공유 프로젝트가 있습니다

MainProject
└── ResourceFolder
ㅤ├──A
ㅤㅤ├── resource1
ㅤㅤ└── resource2
ㅤ├── B
ㅤㅤ├── resource1
ㅤㅤ└── resource2
ㅤ└── C
ㅤㅤ├── resource1
ㅤㅤ└── resource2

SharedProject
└── ResourceFolder
ㅤ├── A
ㅤㅤ├── resource3
ㅤㅤ└── resource4
ㅤ├── B
ㅤㅤ├── resource3
ㅤㅤ└── resource4
ㅤ└── C
ㅤㅤ├── resource3
ㅤㅤ└── resource4

디렉토리가 이렇게 되어 있을 때, 수동으로 일일히 지정하지 않고 출력 디렉토리가 아래처럼 되게 복사하는 방법이 있을까요? 방법이 잘 안 떠오르네요.

출력 디렉토리
└── ResourceFolder
ㅤ├── A
ㅤㅤ├── resource1
ㅤㅤ├── resource2
ㅤㅤ├── resource3
ㅤㅤ└── resource4
ㅤ├── B
ㅤㅤ├── resource1
ㅤㅤ├── resource2
ㅤㅤ├── resource3
ㅤㅤ└── resource4
ㅤ└── C
ㅤㅤ├── resource1
ㅤㅤ├── resource2
ㅤㅤ├── resource3
ㅤㅤ└── resource4

  1. 메인 프로젝트에서 임베드에 해당하는 위치의 공유 프로젝트 리소스를 마찬가지로 임베드하려고 다음과 같이 했습니다

솔루션 디렉토리
└── MainProject
ㅤ└── MainProject.csproj
└── SharedProject
ㅤ└── …

[MainProject.csproj]
<EmbeddedResource Include=“..\공유프로젝트폴더\EmbeddedResourceFolder\*.*”></EmbeddedResource>

그런데 이렇게 하니까 해당 위치에 있는 파일이 IDE에서 메인 프로젝트의 최상위 위치에 이상하게 섞이게 되더라고요
<Visible>false</Visible> 을 줘서 일단 안보이게는 했는데, 빌드한 뒤 임베드 리소스의 이름을 확인해보니

제가 예상하는
공유프로젝트.EmbeddedResourceFolder.파일명.확장자
가 아니라

메인프로젝트.파일명.확장자
가 됩니다. 이름이 경로대로 만들어진다고 생각했는데 왜 이러는 걸까요? 혹은 직접 생성 방식을 직접 정의하는 방법이 있을까요?

1개의 좋아요

현재 output 형태는 어떻게 되시나요?

1개의 좋아요

아직 아무것도 구성하지 않아서 $(TargetPath) 뿐입니다

1개의 좋아요

startup 프로젝트의 csproj를 편집하여 대상 프로젝트의 리소스를 링크해서 output을 만들어내거나 빌드 후 특정 폴더의 파일들을 복사하는 방식으로 해결이 가능할 것 같은데 테스트가 필요하겠네요.

리소스 폴더 링크

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

빌드 후 특정 폴더 복사

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

참조

3개의 좋아요

잘못 친 게 많았네요… 해결되었습니다

1개의 좋아요

해결 되셨다니 다행이네요~

다른 방법도 있네요. 취향껏 하시면 될 것 같습니다.

<ItemGroup>
        <ContentWithTargetPath Include="Contents/**/*.*"
                               TargetPath="Contents/%(Filename)%(Extension)"
                               CopyToOutputDirectory="PreserveNewest" />
    </ItemGroup>

참고

3개의 좋아요