127

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

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

4

7 に答える 7

176

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

あらすじはこちら。ファイルを含めた後、ファイルを除外する方法も示します。

余分なファイルを含める

余分なファイルをパッケージに含めるのは少し難しいですが、MSBuild に慣れている場合や、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 があります。たとえば、Sample.Debug.xml という名前のファイルが Web アプリケーションに含まれていて、作成されたパッケージからそのファイルを除外したいとします。その import ステートメントの後に、以下のスニペットを配置できます。

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

この項目の入力を宣言すると、ファイルは自動的に除外されます。FromTargetここでのメタデータの使用に注意してください。ここでは触れませんが、常に指定することを知っておく必要があります。

于 2010-05-01T03:15:25.360 に答える
22

より簡単な解決策は、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フォルダーの以前の欠点が取り除かれました。私には未確認です。

于 2011-04-16T05:49:44.110 に答える
6

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

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

于 2011-05-15T03:13:11.400 に答える
5

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

基本的に、"CopyAllFilesToSingleFolderForPackageDependsOn" の代わりに "CopyAllFilesToSingleFolderForMsdeployDependsOn" を使用する必要があるかもしれません。

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

于 2012-11-17T03:43:13.103 に答える
3

Sayedの回答の補足として、プロジェクト内のExcludeFromPackageFilesアイテムの静的宣言では不十分であることがわかりました。コンパイル後にのみ使用可能になった特定のDLLを除外する必要がありました(IISに展開するときに不要なAzure固有のNinjectモジュール)。

そこで、上記のCopyAllFilesToSingleFolderForPackageDependsOnトリックSayedを使用して、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>

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

于 2011-05-12T12:57:27.410 に答える
1

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

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

于 2019-10-24T07:48:12.687 に答える