3

MSBuild を使用して Web アプリケーション プロジェクトをビルドし、パラメーターを追加してパッケージ ファイルを作成しています。それはすべて良いことです。_PublishedWebSites出力に 2 つのフォルダーが表示されます。

AppName
AppName_Package

フォルダーにはApplicationNameサイト全体があり、このフォルダーを Web サイトにコピーするだけで実行できます。

Package フォルダーには、予想される 5 つのファイルがあります。

AppName.deploy.cmd
AppName.-readme.txt
AppName.SetParameters.xml
AppName.SourceManifest.xml
AppName.zip

ただし、パッケージをデプロイすると、Web アプリケーション dll ( AppName.dll) が欠落し、他のいくつかの重要な参照依存関係も欠落します。

パッケージ自体を調べると、ファイルが実際には Web アプリケーションbinディレクトリにないことがわかります。

AppNameファイルはすべてルートフォルダーにありますが、フォルダー内のパッケージには含まれていないことを考えると、これは非常に奇妙ですAppName_Package

私が行った唯一の MSDeploy 関連の変更は、CopyAllFilesToSingleFolderForPackageDependsOnターゲットをオーバーライドして、ライブラリ プロジェクトからいくつかのハンドラーをコピーすることであり、これはすべてうまく機能します。

<PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
        CustomCollectFiles;
        $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>
<Target Name="CustomCollectFiles">
    <ItemGroup>
        <_CustomFiles Include="..\Libraries\CodeLibrary1\**\*.ashx" />
        <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
            <DestinationRelativePath>$(ProjectDir)%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
        </FilesForPackagingFromProject>
    </ItemGroup>
</Target>

そのため、パッケージ作成プロセス中に Web アプリケーションの DLL がbinディレクトリから削除され、他の (参照されている) DLL がいくつか削除される理由を特定することはできません (ただし、すべてではなく、おそらく 3%)。

ログファイルで何を探すべきか考えていますか?

編集: (Sayed への応答):

私の投稿に答えていただき、本当にありがとうございます。残念ながら、私たちが同じページにいるかどうかはわかりません。私が言ったように、私は自分の問題が何であるかを実際に他の人に理解させるのに十分なほど十分に自分の問題を説明していないかもしれません. 明確にするためにもう一度試してみましょう

外部ファイルを Web アプリケーションにコピーすることは問題ではありませんでした。私の投稿をスキャンして、非常に一般的な「CopyAllFilesToSingleFolderForPackageDependsOn」要素を確認すると、いくつかの危険信号、警告、警笛が鳴り響くことがわかりました。。それは人々が苦労している共通のことのようであり、あなたが指摘するように、それが実行されることにいくつかの問題がありました。それは私にとってはうまくいきました。

私の問題は、DLL を参照するプロジェクトと関係があり、最も重要なのは、アプリケーション DLL 自体がコピーされていないことです。

今日、さらに微調整したことで、私が気付いていなかったことが明らかになりました。例えば:

TFS でビルドを開始すると、いくつかのものが出力されます。

  1. TFS からのソースは、ソース ディレクトリ (SourceDir) に出力されます。

    • これには、TFS にチェックインされた出力のみが含まれます
    • これには、プロジェクトまたはファイルの参照は含まれず、TFS でコミットされたもののみが含まれます
  2. ビルドの出力は 2 つのフォルダーにあります

    • バイナリ (プロジェクトとファイルの参照を含む)
    • ソース (TFS に含まれている/コミットされているもののみ)

Binaries 内には _publishedWebsites フォルダーとすべてのプロジェクトとファイルの参照があり、Sources 内には TFS にチェックインされているファイルだけがあります。

私の問題、または混乱は、次のパラメーターを MSBuild Arguments に渡すと、ビルド (_PublishedWebsites) からの出力が取得され、それらのファイルを使用してパッケージが作成されると考えていたことです。それはしません。

実際のプロセスでは、SOURCES フォルダー内のファイルに基づいてパッケージがビルドされます。したがって、ここに私のジレンマ/混乱があります。アプリケーション dll をソースにコミットしなかったため、パッケージに含まれていなかったため、テスト サーバーのテスト サイトに送信されていませんでした。

/p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:CreatePackageOnPublish=True /p:MSDeployPublishMethod=RemoteAgent /p:MSDeployServiceUrl=http://<mytestsite> /p:DeployIisAppPath="<AppName>" /p:UserName=<domain\user> /p:Password=<mypassword> /p:SkipExtraFilesOnServer=false /p:AllowUntrustedCertificate=True

これをまとめると、開発マシンでアプリケーション DLL を「編集のためにチェックアウト」し、ソリューションをコンパイルし、最後にアプリケーション DLL をソース管理にコミットすると、別のパッケージとして含まれているため、パッケージに含まれます。ソースアイテム。

したがって、これは、TFS BUILD の出力をソース フォルダーに取得し、それを msdeploy が使用するパッケージに含める方法を理解していない私のせいだと思います。

パッケージの作成は_PublishedWebsitesフォルダーではなくSourcesフォルダーから行われるという、私が見逃した、またはざっと目を通しただけの非常に基本的なことがおそらくあります。また、MSBuild でコンパイルされたアプリケーション dll とプロジェクト参照 dll をパッケージに取得する方法も理解していません (ソース管理でコミットされたソース項目を置き換えます)。

私は見逃したので、これがあなたの時間を完全に無駄にしないことを願っています

source=<some-parameter>

どこか。
これを理解し、これを機能させることができるはずの場所をすでに説明している既存の情報源に私を案内していただければ幸いです。または、ここで私に言うのがとても簡単な場合.

4

1 に答える 1

4

ここでの問題は、CopyAllFilesToSingleFolderForPackage ターゲット自体が VS2012 ターゲットから呼び出されないことです。私たちは多くの変更を加えましたが、これは私たちの側の回帰である可能性があります. 何かできることがないか検討してみます。幸いなことに、これを更新して、探している動作を取得するのは非常に簡単です。CopyAllFilesToSingleFolderForPackageDependsOn を使用する代わりに、代わりに PipelineCollectFilesPhaseDependsOn を使用できるはずです。上記のものを変更できるはずです

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

<Target Name="CustomCollectFiles">
    <Message Text="Inside of CustomCollectFiles" Importance="high"/>
    <ItemGroup>
      <_CustomFiles Include="C:\Temp\_NET\WAP-AfterPublish\MvcApplication1\additional files\**\*" />

      <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
        <DestinationRelativePath>additional files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
</Target>

VS2012 と VS2010 の両方でこれを試したので、これは CopyAllFilesToSingleFolderForPackageDependsOn アプローチよりも解決策として優れているようです。それを試してみて、わかったことを教えてもらえますか?

于 2012-09-11T17:45:34.403 に答える