web-dev-qa-db-ja.com

VS2010 Web展開パッケージを使用して追加ファイルを含めるにはどうすればよいですか?

Visual Studio 2010の新しいWebパッケージ機能を使用してテストしているときに、ビルド前イベントを使用して、API呼び出しでアプリが依存するbinフォルダーに必要な.dllをコピーする状況に遭遇しました。これらは、相互運用で使用できるCOM dllではないため、参照として含めることはできません。

展開パッケージをビルドするときに、アプリの実行に必要なファイルのみを含めるオプションを選択すると、これらのファイルは除外されます。これらのファイルを含めるように展開設定を構成する方法はありますか?これに関する良いドキュメントを見つけることができなかった。

124
Jason

いい質問ですね。これについて非常に詳細なブログエントリを Web展開ツール(MSDeploy):追加ファイルを含む、または特定のファイルを除外するパッケージをビルドする に投稿しました。

ここに概要があります。ファイルを含めた後、ファイルを除外する方法も示します。

追加ファイルを含める

パッケージに余分なファイルを含めるのは少し難しくなりますが、MSBuildに慣れていて、それを読んでいないのであれば、まだ大したことはありません。これを行うには、パッケージ化のためにファイルを収集するプロセスの一部にフックする必要があります。拡張する必要があるターゲットは、CopyAllFilesToSingleFolderと呼ばれます。このターゲットには依存関係プロパティPipelinePreDeployCopyAllFilesToOneFolderDependsOnがあり、これを使用して独自のターゲットを挿入できます。したがって、CustomCollectFilesという名前のターゲットを作成し、それをプロセスに注入します。これを実現するには、次のようにします(importステートメントの後に覚えておいてください)。

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

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

これにより、プロセスにターゲットが追加されます。ターゲット自体を定義する必要があります。 Webプロジェクトの1レベル上にある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で作成されたWebアプリケーションのプロジェクトファイルを下部に開くと、行が表示されます。

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

ところで、VS内でプロジェクトファイルを開くことができます。プロジェクトを右クリックして、プロジェクトのアンロードを選択します。次に、アンロードされたプロジェクトを右クリックして、「プロジェクトの編集」を選択します。

このステートメントには、必要なすべてのターゲットとタスクが含まれます。ほとんどのカスタマイズは、インポート後かどうかがわからない場合は、インポート後に行う必要があります!そのため、除外するファイルがある場合、そのために使用できるアイテム名ExcludeFromPackageFilesがあります。たとえば、Webアプリケーションに含まれるSample.Debug.jsという名前のファイルがあり、作成されたパッケージからそのファイルを除外するとします。そのimportステートメントの後に、以下のスニペットを配置できます。

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

このアイテムを設定すると、ファイルは自動的に除外されます。ここでFromTargetメタデータの使用に注意してください。ここでは説明しませんが、常に指定するようにしてください。

171

より簡単な解決策は、csprojファイルを編集して、必要なdllをbinフォルダーに含めてから、beforebuildターゲットを作成して、サードパーティの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フォルダーの以前の欠点が削除されました。私には未確認。

21
toxaq

@toxaqと同様ですが、さらに簡単な解決策は次のとおりです。

ソリューションエクスプローラーで、ファイルをライブラリ/参照フォルダーへのリンクとして追加し、プロパティでビルドの出力にコピーされるように設定します。

7
eglasius

そのため、Sayedの実装はうまくいきませんでした。私はVS2013を使用しており、Web Deployパッケージを使用しており、別のフォルダーからいくつかのプラグインDLLをdeployパッケージのbinに追加する必要がありました。これがどのように動作するように管理したかです(はるかに簡単です):

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" />
6
K0D4

上記のEmil Lerchのコメントを強調するためにコメントしたかった。 Azure SDKをインストールした場合は、別のDependencyPropertyを探します。

基本的に、「CopyAllFilesToSingleFolderForPackageDependsOn」の代わりに「CopyAllFilesToSingleFolderForMsdeployDependsOn」を使用する必要がある場合があります。

これがうまく機能せず、Azure SDKをインストールした場合の別のリンクを次に示します。 http://forums.iis.net/t/1190714.aspx

5
Paul Schroeder

Sayedの回答の補遺として、プロジェクト内のExcludeFromPackageFilesアイテムの静的宣言では不十分であることがわかりました。使用可能な特定のDLLを除外する必要がありましたafter compile(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>

それが誰かを助けることを願っています...

3
Peter McEvoy