빌드 후 이벤트의 파일을 포함하도록 Visual Studio '게시'기능을 얻는 방법은 무엇입니까?


90

현재 웹 배포 요구 사항을 처리하기 위해 Visual Studio 2010 '게시'및 MSDeploy 기능을 사용하려고하지만 빌드 구성에 따라 패키지를 사용자 지정하는 것과 관련하여 장애물이 있습니다.

32 비트 환경에서 개발하지만 64 비트 환경을위한 릴리스 패키지를 만들어야하므로 'Release'구성에서 64 비트 버전의 타사 dll을 bin 디렉토리에 복사하여 32 비트 버전을 덮어 쓰는 빌드 후 이벤트가 있습니다. . '게시'기능을 사용할 때 올바른 64 비트 dll이 bin 디렉터리에 복사되지만 패키지에 포함되지 않습니다.

빌드 후 이벤트 중에 bin 디렉토리에 복사 된 파일을 포함하도록 '게시'하는 방법이 있습니까?


1
대신 빌드 이벤트 를 사용하는 경우 이미 원하는대로 작동하는 것 같습니다 (Visual Studio 2013, ASP.NET 프로젝트 템플릿).
bzlm

Visual Studio 2015 이상에서 위의 주석에 언급 된 미리 빌드 된 동작을 제거한 것으로 보입니다.
justdan23 2017-08-14

답변:


92

VS2010 웹 배포 패키지를 사용하여 추가 파일어떻게 포함합니까? 에서 비슷하지만 다른 질문에 대답했습니다 . .

귀하의 시나리오에서 빌드 후 이벤트를 사용하는 경우 빌드 후 이벤트를 삭제하고 빌드 후 이벤트 대신 고유 한 MSBuild 대상을 사용하여 작업을 구현하는 것이 좋습니다. 아래에서 다른 답변의 텍스트를 찾을 수 있습니다.


From : VS2010 웹 배포 패키지를 사용하여 추가 파일을 어떻게 포함합니까?


좋은 질문입니다. 웹 배포 도구 (MSDeploy) : 추가 파일을 포함하거나 특정 파일을 제외하는 패키지 빌드 에 이에 대한 매우 자세한 블로그 항목을 게시했습니다 .

여기에 시놉시스가 있습니다. 파일을 포함시킨 후 파일을 제외하는 방법도 보여줍니다.

추가 파일 포함

패키지에 추가 파일을 포함하는 것은 조금 더 어렵지만 MSBuild에 익숙하고이 글을 읽지 않는다면 여전히 큰 문제가 아닙니다. 이렇게하려면 패키징 할 파일을 수집하는 프로세스 부분에 연결해야합니다. 확장해야하는 대상은 CopyAllFilesToSingleFolder입니다. 이 대상에는 자체 대상을 탭하여 삽입 할 수있는 종속성 속성 PipelinePreDeployCopyAllFilesToOneFolderDependsOn이 있습니다. 따라서 CustomCollectFiles라는 대상을 만들고이를 프로세스에 삽입합니다. 다음을 통해이를 달성합니다 (import 문 이후에 기억).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

이렇게하면 대상이 프로세스에 추가되므로 이제 대상 자체를 정의해야합니다. 웹 프로젝트보다 한 수준 위에있는 Extra Files라는 폴더가 있다고 가정 해 보겠습니다. 이러한 파일을 모두 포함하려고합니다. 다음은 CustomCollectFiles 대상이며 그 후에 논의합니다.

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

여기서 내가 한 일은 _CustomFiles 항목을 만들고 Include 속성에서 해당 폴더와 그 아래의 모든 폴더에있는 모든 파일을 선택하도록 지시했습니다. 그런 다음이 항목을 사용하여 FilesForPackagingFromProject 항목을 채 웁니다. 이것은 MSDeploy가 실제로 추가 파일을 추가하는 데 사용하는 항목입니다. 또한 메타 데이터 DestinationRelativePath 값을 선언했습니다. 이것은 패키지에 배치 될 상대 경로를 결정합니다. 여기서 Extra Files % (RecursiveDir) % (Filename) % (Extension) 문을 사용했습니다. 그것이 말하는 것은 Extra Files 폴더 아래에있는 패키지의 동일한 상대 위치에 배치하는 것입니다.

파일 제외

VS 2010으로 만든 웹 응용 프로그램의 프로젝트 파일을 아래쪽에 열면 줄이 있습니다.

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

BTW 당신은 ​​VS 내에서 프로젝트 파일을 열 수 있습니다. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 프로젝트 언로드를 선택합니다. 그런 다음 언로드 된 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 프로젝트 편집을 선택합니다.

이 진술에는 우리가 필요로하는 모든 목표와 작업이 포함됩니다. 대부분의 커스터마이제이션은 가져 오기 이후에 이루어져야합니다. 따라서 제외 할 파일이있는 경우이를 수행하는 데 사용할 수있는 항목 이름 ExcludeFromPackageFiles가 있습니다. 예를 들어 웹 애플리케이션에 포함 된 Sample.Debug.js라는 파일이 있지만 생성 된 패키지에서 해당 파일을 제외하려고한다고 가정 해 보겠습니다. 해당 import 문 뒤에 아래 스 니펫을 배치 할 수 있습니다.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

이 항목을 채우도록 선언하면 파일이 자동으로 제외됩니다. 여기에서 FromTarget 메타 데이터의 사용법을 확인하십시오. 나는 여기서 그것에 대해 다루지 않을 것이지만, 당신은 항상 그것을 명시하는 것을 알아야합니다.


8
@Sayed, 이것은 VS2012에서 작동하지 않는 것 같습니다.이 시나리오에서 이것이 어떻게 업데이트 될 수 있는지 알고 있습니까? v11.0으로 변경해도 작동하지 않습니다. TIA.
Simon Francesco

2
이 물건에 대한 문서는 말 그대로 어디에도 없습니다. Microsoft 설명서는 블로그를 참조합니다.
매튜 제임스 데이비스

2
@Daniel 폴더가 아닌 특정 파일 만 필요한 경우 ***로 재귀 적으로 추가하는 대신 해당 특정 파일을 포함하도록 _CustomFiles를 변경하십시오. 그래서 <_CustomFiles Include = ".. \ Dependencies \ FileA.dll"/> <_ CustomFiles Include = "C : \ Someotherplace \ FileB.txt"/> 이와 비슷한 것입니다.
bwerks 2014

3
@SimonFrancesco 나는 이것을 경험했으며 필요한 변경 사항은 위의 답변에 작성된 <CopyAllFilesToSingleFolderForPackageDependsOn>이 아닌 <CopyAllFilesToSingleFolderForMsdeployDependsOn>을 확장하는 것 같습니다.
bwerks 2014


13

ExcludeFilesFromDeployment프로젝트 파일 내의 요소 를 사용하여 문제에 대한 해결 방법을 찾았습니다 . 웹 배포 : 파일 및 폴더 제외 에서 아이디어를 얻었습니다.

따라서 성공적인 빌드 및 관련 빌드 후 단계 후 프로젝트 디렉터리에있는 프로젝트 파일을 패키지화해야하는 경우 다음을 수행합니다.

  1. "패키지 / 웹 게시"프로젝트 설정을 편집하고 "
    이 프로젝트 폴더의 모든 파일"이되도록 배포 할 항목을 선택합니다.
  2. 프로젝트 언로드
  3. 언로드 된 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 프로젝트 구성 편집을 선택합니다.
  4. PropertyGroup구성 설정과 관련된 요소를 찾습니다 ( 예 : "Release").
  5. PropertyGroup요소 내에서 다음 요소를 추가하고 패키지에서 원하지 않는 파일 및 폴더를 제외하십시오.

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  6. 프로젝트 저장 및 다시로드

이것은 당분간 내 문제를 해결하지만 더 나은 해결책이 있다면 알려주십시오. 해커가 관련되어 이상적이지 않지만 다시 이것은 드문 배포 시나리오일까요?


6

파일 또는 폴더를 선택하고 속성 창에서 빌드 작업을 콘텐츠로 변경합니다.


1
맞습니다. 그러나 "콘텐츠"가 선택 되더라도 기본 동작은 "복사 안 함"이므로 "최신 버전 인 경우 복사"또는 "항상 복사"를 선택해야합니다.
Matt

1
추가 단계 매트에 동의
고메스

7
폴더에 대한 빌드 작업이 없습니다 (VS2013)
Cristian E.

copytooutputdirectory = 복사 항상
고메스

항상 복사 없이도 작업했습니다.
Tengiz

3

나는 그것의 오래된 질문을 알고 있지만 이것들 중 어느 것도 나를 위해 일하지 않았습니다.

2017 VS에서는 게시 할 추가 폴더를 마우스 오른쪽 버튼으로 클릭하고 게시를 선택했습니다.

예:

여기에 이미지 설명 입력


작은 추가 단계이지만 매우 간단합니다.
Ciaran Gallagher

0

프로젝트bin 폴더 (및 그 내용)를 추가하면 파일이 게시 출력 디렉토리에 복사됩니다.

나에게 문제는 독점 소프트웨어 라이센스 파일을 bin / 폴더에 배치해야했지만 배포 할 때마다 수동으로 복사하고 싶지 않았다는 것입니다.

이것은 Visual Studio 2015 Professional을 사용했습니다.


0

나는 이것이 오래된 대화라는 것을 알고 있지만 똑같은 일을 시도하면서 왔고 여기에서 찾은 것을 추가하는 것이 도움이 될 것이라고 생각했습니다.

발행물에 추가 파일을 포함하는 방법에 대한 거의 모든 기사는이 방법을 사용하여 CopyAllFilesToSingleFolderForPackageDependsOn또는 CopyAllFilesToSingleFolderForMSDeployDependsOn항목을PropertyGroup 하며 "파일 끝에 이것을 추가했습니다 ..."와 같이 모두 동일합니다.

이것이 내가 한 일 PropertyGroup이며 파일 상단에 이미 섹션 이 있음을 깨달을 때까지 아무 일도 일어나지 않는 이유를 찾으려고 오후에 보냈습니다 . 내가 넣을 때CopyAllFilesToSingleFolderForPackageDependsOn 그 섹션에 잘 작동했습니다.

이것이 언젠가 누군가의 시간을 절약하기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.