7

バックグラウンド

私は、非常に大規模な asp.net Web サイト プロジェクトを引き継ぎました。以前の展開プロセスでは、.cs、.aspx、および .ascx ファイルを IIS にコピーし、その場でビルドしていました。プリコンパイルし、TeamCity を使用して自動的にデプロイしたいと考えています。私は他のいくつかのウェブサイトプロジェクトでこれを行いました。

このプロジェクトには約 350 のユーザー コントロールがあり、フォルダーにうまく整理されていますが、さまざまな場所で使用されています。他のフォルダーから、相互に参照されるコントロール... 基本的に、循環ファイル参照の悪夢です。

私の試み

私の最初の試みは、他のものと同じように構築することでした。vs2012 ソリューション全体を MSbuild します。大量の「循環ファイル参照は許可されていません」に遭遇しました。これらの適切に編成されたコントロールがあらゆる場所で使用されており、循環参照がいたるところにあることを確認してください。これを読んで、「web.config」をに切り替え、compilation batch="false"ビルドでサイトを「更新不可」および「固定命名アセンブリを使用」に設定しました。サイトはビルドされますが、クアッドコア、ssd、16GB RAM dev ボックスでコンパイルするのに文字通り 25 分かかります。これは容認できないビルド時間です。

「固定命名アセンブリを使用する」をオフにすると、サイトのビルドが大幅に高速化されることがわかっています。(私は小さなウェブサイトの 1 つでそれを証明しました。4 分から 45 秒になりました)。その設定を削除すると、奇妙なビルド エラーが発生します。

c:\Projects\Web\Site.master(146): error CS0433: The type 'ASP.usercontrols_modules_viewprofilepopup_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_viewprofilepopup.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_xa514so5.dll'

c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_site.master.cdcab7d2.0.cs(927): error CS0433: The type 'ASP.usercontrols_modules_viewprofilepopup_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_viewprofilepopup.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_xa514so5.dll'

error ASPPARSE: c:\Projects\web\Web\UserControls\Modules\JobsLeftMenu.ascx(128): error CS0433: The type 'ASP.usercontrols_modules_imagesgallerymodule_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_imagesgallerymodule.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_nvrj33tx.dll'

error ASPPARSE: c:\Projects\web\Web\Site.master(146): error CS0433: The type 'ASP.usercontrols_modules_viewprofilepopup_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_viewprofilepopup.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_xa514so5.dll'

正確な aspnet_compiler.exe コマンドは次のとおりです。

aspnet_compiler.exe -v /web -p Web\ -f "プリコンパイル済み Web"

私は答えを探し回った。いいえ、それらはコード内のどこにも複製されていません。それらはたまたま別のフォルダーにあり、別のフォルダー内の他のコントロールによって使用されます。これは、循環ファイル参照が原因であると感じています。いいよ。これらのいくつかの使用を削除して、それがビルドされるかどうかを確認し、ビルド プロセスがこのような他のエラーに移動するだけです。これに対応するためにコード全体を削除することはできません...「固定命名アセンブリを使用する」をオンにせずにこれらのエラーを修正するにはどうすればよいですか?

私が試したこと

  1. Temporary ASP.NET Filesシステム全体をすべてクリアしました。
  2. Visual Studio 2012 内から「発行」を試みました。同じエラーが発生しました。
  3. サイトを Web アプリケーションに変換しようとしましたが、エラーが多すぎます (600 以上)。
  4. 繰り返しますが、それを説明する重複ファイルとコードがないことを確認してください。Notepad++ を使用してソリューション フォルダー全体をテキスト検索し、同じ名前の別のコントロールがないことを確認しました。
  5. これをチェックしました。
  6. msbuild のパフォーマンス調整をオンにしました。/m /p:CreateHardLinksForCopyLocalIfPossible=true /p:BuildInParallel=true

私は困惑しており、私の唯一の選択肢は、アプリを書き直すか、Web アプリケーションに変換するときにエラーを処理するか、ソースを Web サーバーにデプロイし続けるが自動化することだと考えているようです。

4

1 に答える 1

7

すでに試したことがあることは知っていますが、ここでは循環参照を避けることが最善の策です。「循環参照」という用語は実際には正確ではないことに注意してください。ビルド システムが不平を言うのは、ファイル レベルではなく、ディレクトリ レベルでの循環参照です。

例:sub1\page.aspx用途sub2\uc1.ascxsub1\uc2.ascx

ファイル レベルでは円はありませんが、ディレクトリ レベルでは円があり、バッチ処理のしくみが台無しになっています。

修正不可能なほど多くの状況が発生しているように見えるかもしれませんが、「ディレクトリ サークル」の詳細を見ると、それほど多くないことが原因であると確信できます。参照グラフを描くと、物事を理解するのに役立つ場合があります。

次に、犯罪者を別のフォルダーに移動し、それに応じてリンクを変更するだけです.

はい、それは骨の折れるプロセスですが、おそらく解決可能です。

于 2013-02-11T23:38:24.490 に答える