VS2010 Web展開パッケージを使用して追加のファイルをどのように含めますか?


125

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

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

回答:


176

すばらしい質問です。これについての非常に詳細なブログエントリを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.xmlという名前のファイルがあるが、作成したパッケージからそのファイルを除外したいとします。以下のスニペットは、インポートステートメントの後に配置できます。

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

このアイテムの入力を宣言すると、ファイルは自動的に除外されます。FromTargetここでメタデータの使用法に注意してください。ここでは詳しく説明しませんが、必ず指定する必要があります。


3
追加のプロジェクト出力をパブリッシュに含めるために、例を拡張できますか?
アンソニーセルジュコフ

7
私はVS2012(RC)をインストールしていますが、私には別のDependencyPropertyがありました。混合チーム(および私たちのビルドサーバー)をサポートするために、元のCopyAllFilesToSingleFolderForPackageDependsOn構成、DependencyProperty CopyAllFilesToSingleFolderForMsdeployDependsOnを使用した複製を作成しました
Emil Lerch

2
これは素晴らしい。これを使用して、txtファイルに保存されているいくつかのバージョン情報をデプロイします。
ラマラント2013年

5
これは私にはうまくいかないようです。VStudio 2013を使用しています。:(上記のmsbuildセットアップは2013で機能しますか?
irperez

8
@SayedIbrahimHashimi and co。このガイドのはるかに最新のバージョンをasp.net Webサイトで作成しました。私はそのリンクを強くお勧めします。それは、pubxmlファイルの代わりにcsprojファイルを変更するのが難しいという違いだったからです。
アダムベネチア

21

より簡単な解決策は、必要なdllをbinフォルダーに含めるようにcsprojファイルを編集してから、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フォルダーの以前の欠点が削除されました。私は未確認です。


3
「シンプルさが究極の洗練」
BornToCode

1
これは多くの場合機能しますが、binフォルダーの外に含める必要があるファイルがある場合は機能しません。
Nathanは

5
@toxaq、何かが足りない可能性がありますが、遭遇した問題は、実際にはbinフォルダーにない展開パッケージ内の場所にファイルが必要であるということでした。そのため、はい、ファイルをどこからでもbinフォルダーにコピーできますが、そのシナリオでは、それらは展開パッケージの正しい場所に含まれません。その価値について、私が遭遇した状況はClearScript.V8プロジェクトでした-ネイティブ.dll はbinディレクトリに表示されてはなら、その親に表示される必要があります- 議論についてはclearscript.codeplex.com/discussions/438696を参照してください。
ネイサン

3
できれば、さらに10回賛成票を投じます。これは受け入れられる答えになるはずです。また<Visible>false</Visible>、ソリューションエクスプローラーから非表示に設定できることも追加します。
tuespetre 2014年

1
@Tohidありがとう、その編集を行いました。テストするMSのものがないので、検証していません。
toxaq 2015年

7

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

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


3
-1これは、プロジェクトが明示的なリンカーと時間の関係を望んでいることを前提としています。プラグインタイプのシステムには適さない
MickyD '19 / 06/19

6

つまり、Sayedの実装は私にとってはうまくいきませんでした。私はVS2013とWeb配置パッケージを使用しており、別のフォルダーから配置パッケージのビンにいくつかのプラグイン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を使用しており、別のプロジェクトのbinフォルダーから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モジュール)。

それで、私は上に投稿されたSayedのトリック、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

また、ファイルをコンテンツとして設定することも可能です。常にコピー

また、ファイルをコンテンツとして設定することも可能です。 常にコピー


1
それは最も簡単で明らかなように、これはトップの答えである必要がありそうです
J Miglietta
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.