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


125

Visual Studio 2010에서 새로운 웹 패키징 기능을 사용하여 테스트 중이며 사전 빌드 이벤트를 사용하여 필요한 .dll을 내 응용 프로그램이 API 호출에 의존하는 bin 폴더에 복사하는 상황이 발생했습니다. interop과 함께 사용할 수있는 COM dll이 아니기 때문에 참조로 포함 할 수 없습니다.

배포 패키지를 빌드 할 때 앱을 실행하는 데 필요한 파일 만 포함하는 옵션을 선택하면 해당 파일이 제외됩니다. 이러한 파일을 포함하도록 배포 설정을 구성하는 방법이 있습니까? 나는 이것에 대한 좋은 문서를 찾는 데 운이 없었습니다.

답변:


176

좋은 질문입니다. 방금 MSDeploy (Web Deployment Tool) 에 자세한 블로그 항목을 게시했습니다 . 추가 파일을 포함하거나 특정 파일을 제외하고 빌드 패키지 .

다음은 시놉시스입니다. 파일을 포함시킨 후 파일을 제외하는 방법도 보여줍니다.

추가 파일 포함

패키지에 추가 파일을 포함시키는 것은 약간 어렵지만 MSBuild에 익숙하고 읽을 수 없다면 큰 편이 아닙니다. 이렇게하려면 패키징 할 파일을 수집하는 프로세스 부분에 연결해야합니다. 확장해야하는 대상을 CopyAllFilesToSingleFolder라고합니다. 이 대상에는 PipelinePreDeployCopyAllFilesToOneFolderDependsOn이라는 종속성 속성이 있으며이 속성을 사용하여 자체 대상을 주입 할 수 있습니다. 따라서 CustomCollectFiles라는 대상을 만들어 프로세스에 주입합니다. 우리는 이것을 다음과 같이 달성합니다 (import 문 다음에 기억하십시오).

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

  <CopyAllFilesToSingleFolderForMsdeployDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
  </CopyAllFilesToSingleFolderForMsdeployDependsOn>
</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 속성에 해당 폴더와 그 아래의 모든 폴더에서 모든 파일을 가져 오도록 지시 한 것입니다. 우연히 해당 목록에서 무언가 를 제외 해야하는 경우에 Exclude속성을 추가하십시오 _CustomFiles.

그런 다음이 항목을 사용하여 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.xml이라는 파일이 있지만 해당 파일을 생성 된 패키지에서 제외하려는 경우를 가정 해 보겠습니다. 해당 import 문 다음에 스 니펫을 아래에 배치 할 수 있습니다.

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

이 항목을 채우면 파일이 자동으로 제외됩니다. FromTarget여기 에서 메타 데이터 사용법을 참고 하십시오. 나는 여기에 들어 가지 않을 것이지만 항상 그것을 지정해야한다는 것을 알아야합니다.


3
추가 프로젝트 출력을 게시에 포함시키기 위해 예제를 확장 할 수 있습니까?
Anthony Serdyukov

7
VS2012 (RC)가 설치되어 있으며 다른 DependencyProperty가 있습니다. 혼합 팀 (우리의 빌드 서버)를 지원하기 위해, 나는 원래 CopyAllFilesToSingleFolderForPackageDependsOn 구성했다 DependencyProperty에 CopyAllFilesToSingleFolderForMsdeployDependsOn를 사용하여 중복
에밀 레르 히

2
훌륭합니다. 이를 사용하여 txt 파일에 저장된 일부 버전 정보를 배포합니다.
lamarant

5
이것은 나를 위해 작동하지 않는 것 같습니다. VStudio 2013을 사용하고 있습니다. :( 위의 msbuild 설정이 2013 년에 작동합니까?
irperez

8
@SayedIbrahimHashimi와 공동. asp.net 웹 사이트 에서이 안내서의 최신 버전을 작성했습니다 . 링크가 pubxml 파일 대신 csproj 파일을 수정하는 데 걸리는 차이가 있었기 때문에 링크를 사용하는 것이 좋습니다.
Adam Venezia

21

더 간단한 해결책은 csproj 파일을 편집하여 bin 폴더에 필요한 dll을 포함시킨 다음 사전 빌드 대상을 만들어 타사 dll을 저장하는 공통 라이브러리 폴더에서 bin 폴더로 항목을 복사하는 것입니다. 항목은 솔루션 파일에 존재하므로 msbuild / msdeploy에 의해 배포되며 복잡한 작업은 필요하지 않습니다.

VS를 통해 추가하지 않고 파일을 포함하는 데 사용되는 태그 (일반적으로 VCS에 추가하려는 경우)

<Content Include="Bin\3rdPartyNative.dll" ><Visible>false</Visible></Content>

이것은 나를 위해 만든 BeforeBuild 대상입니다.

<Target Name="BeforeBuild">
    <Message Text="Copy $(SolutionDir)Library\3rdPartyNative.dll to '$(TargetDir)'3rdPartyNative.dll" Importance="high" />
    <Copy SourceFiles="$(SolutionDir)Library\3rdPartyNative.dll" DestinationFiles="$(TargetDir)3rdPartyNative.dll" />
</Target>

@tuespetre의 제안을 포함하여 항목을 숨기도록 표시하여 표시되는 bin 폴더의 이전 단점을 제거했습니다. 내가 확인하지 못했습니다.


3
"단순함은 최고의 정교함"
BornToCode

1
많은 경우에 작동하지만 bin 폴더 외부에 포함해야하는 파일이 있으면 작동하지 않습니다.
Nathan

5
@ toxaq, 뭔가 빠졌을 수도 있지만 실제로 문제 는 bin 폴더 에 없는 배포 패키지의 위치에 파일이 실제로 필요하다는 것 입니다. 예, 어디에서나 bin 폴더로 파일을 복사 할 수는 있지만 해당 시나리오에서 배포 패키지의 올바른 위치에 포함되지는 않습니다. 어떻게 그 가치를 들면, 나는 ClearScript.V8 프로젝트를이었다에 실행 한 상황 - 네이티브 .dll을 수행해야 하지 bin 디렉토리에 표시하지만, 상위에 표시되어야합니다 - 볼 clearscript.codeplex.com/discussions/438696을 논의하기위한 .
Nathan

3
내가 할 수 있다면 나는 10 번 더 투표 할 것이다. 이것이 정답입니다. 또한 <Visible>false</Visible>솔루션 탐색기에서 숨기도록 설정할 수 있다고 덧붙이고 싶습니다 .
tuespetre

1
@Tohid 감사합니다, 편집했습니다. 테스트 할 MS 물건이 없으므로 확인하지 않았습니다.
toxaq

7

@toxaq과 마찬가지로 더 간단한 해결책은 다음과 같습니다.

솔루션 탐색기에서 파일을 라이브러리 / 참조 폴더에 대한 링크로 추가 한 다음 특성에서 빌드 출력으로 복사되도록 설정하십시오.


3
-1 이것은 프로젝트가 명시적인 링커-시간 관계를 원한다고 가정합니다. 플러그인 타입 시스템에 적합하지 않음
MickyD

6

그래서 Sayed의 구현은 저에게 효과적이지 않았습니다. VS2013을 사용하고 Web Deploy 패키지를 사용하고 있으며 다른 폴더의 플러그인 DLL을 배포 패키지의 저장소에 추가해야했습니다. 작동 방식을보다 쉽게 ​​관리 할 수있는 방법은 다음과 같습니다.

csproj 파일의 맨 아래에 다음을 추가하십시오.

<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
    <ItemGroup> 
        <Files Include="..\SomeOtherProject\bin\$(Configuration)\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(Files)" DestinationFolder="$(_PackageTempDir)\bin\" />  
</Target>

csproj 파일의 다른 언급 가능 항목 :

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DeployOnBuild>true</DeployOnBuild>
    <DeployTarget>Package</DeployTarget>
    <DeployIisAppPath>Default Web Site/MyWebsite</DeployIisAppPath>
    <DesktopBuildPackageLocation>..\output\Service\Service\Service.Release.zip</DesktopBuildPackageLocation>
    <FilesToIncludeForPublish>OnlyFilesToRunTheApp</FilesToIncludeForPublish>
    <ExcludeGeneratedDebugSymbol>true</ExcludeGeneratedDebugSymbol>
    <PublishDatabases>false</PublishDatabases>
</PropertyGroup>

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

감사합니다. VS2015를 사용하고 있으며 다른 프로젝트 저장소 폴더에서 DLL을 추가해야했습니다. 귀하의 솔루션이 가장 쉬웠으며 완벽하게 작동했습니다.
라파엘

5

위에 Emil Lerch의 의견을 강조하기 위해 의견을 원했습니다. Azure SDK를 설치 한 경우 다른 DependencyProperty를 찾으십시오.

기본적으로 "CopyAllFilesToSingleFolderForPackageDependsOn"대신 "CopyAllFilesToSingleFolderForMsdeployDependsOn"을 사용해야 할 수도 있습니다. 실제로 고급 MsBuild 사람이 아니고 대상이 호출되지 않은 이유를 알아 내기 위해 머리카락을 뽑는 데 시간을 낭비하고 있습니다.

이것이 작동하지 않고 Azure SDK를 설치 한 경우 다른 링크가 있습니다. http://forums.iis.net/t/1190714.aspx


3

Sayed의 답변에 대한 부록으로, 프로젝트 내 ExcludeFromPackageFiles 항목의 정적 선언이 충분하지 않다는 것을 알았습니다. 컴파일 후에 만 사용할 수있는 특정 DLL을 제외해야했습니다 (IIS에 배포 할 때 필요하지 않은 Azure 특정 Ninject 모듈).

그래서 위에서 언급 한 CopyAllFilesToSingleFolderForPackageDependsOn 트릭을 사용하여 ExcludeFromPackageFiles 목록을 생성하려고했습니다. 그러나 패키징 프로세스에서 ExcludeFromPackageFiles 항목을 이미 제거 했으므로 너무 늦습니다. 그래서 나는 같은 기술을 사용했지만 조금 더 일찍

<PropertyGroup>
    <ExcludeFilesFromPackageDependsOn>
        $(ExcludeFilesFromPackageDependsOn);
        _ExcludeAzureDlls
    </ExcludeFilesFromPackageDependsOn>
</PropertyGroup>

<Target Name="_ExcludeAzureDlls">
    <ItemGroup>
        <FilesForPackagingFromProjectWithNoAzure Include="@(FilesForPackagingFromProject)"
                               Exclude="%(RootDir)%(Directory)*Azure*.dll" />
        <AzureFiles Include="@(FilesForPackagingFromProject)"
                    Exclude="@(FilesForPackagingFromProjectWithNoAzure)" />
        <ExcludeFromPackageFiles Include="@(AzureFiles)">
            <FromTarget>_ExcludeAzureEnvironmentDlls</FromTarget>
        </ExcludeFromPackageFiles>
    </ItemGroup>
</Target>

누군가를 돕는 희망 ...


1

또한 파일을 Content | 항상 복사

또한 파일을 Content |  항상 복사


1
이것이 가장 쉽고 명백하기 때문에 이것이 최고의 답변이 될 것 같습니다
J Miglietta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.