VS2010 Web展開パッケージを使用して追加ファイルをどのように含めますか?
-
02-10-2019 - |
質問
Visual Studio 2010で新しいWebパッケージング機能を使用してテストしており、API呼び出しにアプリが依存しているBinフォルダーに必要な.dllをコピーするために、ビルド前イベントを使用する状況に遭遇しました。相互作用で使用できるcom dllではないため、参照として含めることはできません。
展開パッケージを作成すると、アプリの実行に必要なファイルのみを含めるオプションを選択すると、これらのファイルは除外されます。これらのファイルを含めるように展開設定を構成する方法はありますか?私はこれについて良い文書を見つける運がありませんでした。
解決
素晴らしい質問。これについて非常に詳細なブログエントリを投稿しました Webデプロイメントツール(MSDEPLOY):追加ファイルを含むパッケージをビルドまたは特定のファイルを除外する.
これが概要です。ファイルを含めた後、ファイルも除外する方法を示します。
追加ファイルを含む
パッケージに追加のファイルを含めることは少し難しいですが、MSBuildに満足している場合はまだBigeeではありません。これを行うには、パッケージング用のファイルを収集するプロセスの部分に接続する必要があります。拡張する必要があるターゲットは、copyallFileStosingLefolderと呼ばれます。このターゲットには、独自のターゲットを活用して注入することができる依存関係プロパティ、PipelinePredepledepledepyallfileStoOneFolderDependsonがあります。そのため、CustomCollectFilesという名前のターゲットを作成し、プロセスに注入します。これを次のことで達成します(インポートステートメントの後に覚えておいてください)。
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
<CopyAllFilesToSingleFolderForMsdeployDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForMsdeployDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
これにより、ターゲットがプロセスに追加されます。これにより、ターゲット自体を定義する必要があります。 Webプロジェクトの上に1レベルにあるExtraファイルという名前のフォルダーがあると仮定します。これらすべてのファイルを含めます。これがCustomCollectFilesのターゲットです。その後、説明します。
<Target Name="CustomCollectFiles">
<ItemGroup>
<_CustomFiles Include="..\Extra Files\**\*" />
<FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
<DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
ここで私がしたことは、アイテム_customfilesを作成することでした。属性に、そのフォルダー内のすべてのファイルとその下の任意のフォルダーをピックアップするように指示されました。たまたまそうする必要がある場合 除外します そのリストから何か、追加 Exclude
属性 _CustomFiles
.
次に、このアイテムを使用して、FilesforPackagingFromprojectアイテムを入力します。これは、MSDEPLOYが実際に使用するアイテムであり、追加のファイルを追加します。また、メタデータDestination -LelativePath値を宣言したことにも注意してください。これにより、パッケージに配置される相対パスが決まります。ここでは、Statement Extra Files%(Recursivedir)%(Filename)%(拡張子)を使用しました。それが言っているのは、追加のファイルフォルダーの下にあるのと同じ相対的な場所にパッケージ内に配置することです。
ファイルを除く
VS 2010で作成されたWebアプリケーションのプロジェクトファイルをその下部に向けて開くと、行があります。
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
ところで、Vsの内部でプロジェクトファイルを開くことができます。プロジェクトの選択プロジェクトを右クリックします。次に、アンロードされたプロジェクトを右クリックして、プロジェクトの編集を選択します。
このステートメントには、必要なすべてのターゲットとタスクが含まれます。私たちのカスタマイズのほとんどは、そのインポートの後である必要があります。したがって、除外するファイルがある場合は、アイテム名、除外FROMPACKAGEFILESを使用します。たとえば、Webアプリケーションに含まれているが、そのファイルを作成したパッケージから除外するという名前のファイルがSample.debug.jsという名前のファイルがあるとしましょう。そのインポートステートメントの後、スニペットを下に配置できます。
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
このアイテムの居住を宣言することにより、ファイルは自動的に除外されます。ここで、fromtargetメタデータの使用に注意してください。ここでは入りませんが、常にそれを指定することを知っておく必要があります。
他のヒント
より簡単なソリューションは、CSPROJファイルを編集して、必要なDLLをBINフォルダーに含めることです。次に、サードパーティのDLLSを保存するCommon LibraryフォルダーからアイテムをBINフォルダーにコピーしてBETHILD BUILDターゲットを作成することです。アイテムはソリューションファイルに存在するため、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の提案を含めるように編集され、目に見えるビンフォルダーの前の欠点を削除します。私によって解かれていない。
@toxaqのように、しかしさらに簡単な解決策は次のとおりです。
Solution Explorerで、ファイルをライブラリ/Referencesフォルダーへのリンクとして追加し、プロパティでビルドの出力にコピーするように設定します。
Sayeedの実装は私にとってはうまくいきませんでした。 vs2013を使用しており、Web Deploy Packageを使用しており、別のフォルダーからいくつかのプラグイン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" />
上記のエミール・ラーチのコメントを強調するためにコメントしたかった。 Azure SDKをインストールしている場合は、別のDependencyPropertyを探してください。
基本的に、「copyallfilestosinglefolderforpackageedepentson」の代わりに「copyallfilestosinglefolderformsdeploydependsonを使用する必要があるかもしれません。
これがあなたのために機能せず、Azure SDKをインストールした場合、別のリンクがあります。 http://forums.iis.net/t/1190714.aspx
Sayeedの答えの補遺として、プロジェクト内の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>
それが誰かを助けることを願っています...