3

Visual Studio 2012、Azure SDK 2.1 を使用して、Azure エミュレーターで実行するための csx フォルダーを作成する最良の方法を見つけようとしています。私の理解では、Azure プロジェクトをパッケージ化するまで csx フォルダーは作成されません。Visual Studio からパッケージを手動で作成できますが、これは自動ビルドのオプションではありません。もう 1 つのオプションは、msbuild コマンド ラインを使用してパッケージを作成することです。これは、再パッケージ化よりも時間がかかるビルドを実際に実行するため、少し手間がかかります。

したがって、cspack はより軽量なオプションである可能性があると考えました。ただし、次のコマンドラインで cspack を呼び出すと:

cspack.exe ServiceDefinition.csdef /copyOnly

次のエラーが表示されます:ロール MyProjWeb の仮想パス 'Web/' の物理ディレクトリを指定する必要があります。

しかし、msbuild を使用するときは、そのようなことはしません。物理ディレクトリの指定と、それが引き起こす可能性のある混乱のいくつかについて、たくさんのことを読みました。そのため、特に msbuild からビルドするときにこれを指定する必要がないため、絶対に必要でない限り使用しないことをお勧めします。

したがって、私の主な質問は、cspack が行っていない msbuild の機能と、cspack で同じことを行う方法です。私の他の質問は、Azure エミュレーターでテストするための csx フォルダーを生成する最も簡単な方法は何ですか?

編集 - 解決

他の人に役立つ場合に備えて、これをどのように解決したかをここに書き留めると思いました。私の質問に対する大きな答え (Chandermani やその他の読み物のおかげ) は、/copyOnly を使用した CSPack は、基本的に、いくつかの規則に従ったフォルダー構造への派手な xcopy であるということです。/copyOnly を使用しない場合は、派手な zip を実行してパッケージを作成します。文句はありませんが、簡単でいいのですが、最初にこれを知っておくとよいでしょう。PHP サイトなど、Visual Studio でビルドできるものに関連付けられていない azure 用のあらゆるものをパッケージ化するために使用できます。msbuild を使用すると、Web サイトの展開の一部であるファイルのみをコピーするという追加の利点があります。

したがって、CSPack を動作させて mvc プロジェクト フォルダーを指定したときにわかったのは、ソース ファイルを含むすべてがコピーされていることです。これは私が欲しかったものではありません。私が見つけた解決策は、最初に Web サイトをパッケージ化してから、パッケージ化されたファイルを CSPack に指定することです。このパスをたどる場合、このリンクはステップバイステップで説明されているため、非常に価値があります。

そのため、Web プロジェクトで msbuild ポストステップを使用してファイルをパッケージ化し、次に Azure プロジェクトでポストステップを使用してそれを cspack するか、Azure プロジェクトで msbuild ポストステップを使用してパッケージを作成します ( cspack には、私の Web 展開ファイルのみを含めるという利点があります)。まあ、ポストステップを1つだけにして、msbuildに面倒な作業を任せる方が簡単で、エラーが発生しにくいように思えました。したがって、私のAzureプロジェクトのポストステップは次のようなものです:

"C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\csrun.exe" /devfabric:shutdown > NUL
"C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\csrun.exe" /devstore:shutdown > NUL
if $(ConfigurationName) == Debug set CONSTANTSPARAMETER=DEBUG
if $(ConfigurationName) == Release set CONSTANTSPARAMETER=
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe $(ProjectDir)$(ProjectFileName) /t:clean;publish /p:Configuration=$(ConfigurationName) /p:TargetProfile=cloud /p:OutputPath=bin\Cloud$(ConfigurationName) /p:VisualStudioVersion=11.0 /p:overwritereadonlyfiles=true /p:DefineConstants="%CONSTANTSPARAMETER%" /verbosity:minimal /p:PostBuildEvent=

最初の 2 行は、コンピューティングおよびストレージ エミュレーターをシャットダウンします。

次の 2 行では、プリプロセッサの定数を設定します。msbuild ラインを使用してビルドすると、#if DEBUG が有効にならないことがわかりました。これはパッケージ作成時にDEBUGが剥がれる安全対策だと思います。自動化されたビルド システムによって作成されたパッケージのみを使用するので、DEBUG を一定に保つことは安全です。

実際の msbuild 行には、いくつかのスイッチがあります。珍しいものについて説明します。

/p:PostBuildEvent=

postBuildEvent を空に設定しないと、同じ post ステップが永遠に呼び出され続けます。そしてこれまで...

/p:VisualStudioVersion=11.0

Microsoft の賢い人たちは、Visual Studio 2010 と 2012 の両方でプロジェクトを開くことを可能にしました。 Azure ツールの間違った Visual Studio フォルダー。

また、クラウド プロファイルを使用していることにも注意してください。私は csx ファイルの後にいるだけなので、この時点でローカルとクラウドのどちらを使用しても違いはないようです。Azure で実行するときは、ServiceConfiguration.Local.cscfg を指定します。

編集:最後に、これを投稿ステップから取り出し、自動ビルドに入れました。私の当初の意図は、開発マシンからテストを実行することは自動ビルドと同じになるということでしたが、ポストステップに時間がかかりすぎて、デバッガーで実行するとビューが proj フォルダーではなく obj フォルダーから取得されました。その場で変更を加えるときはコピーする必要がありました。

未回答の質問

msbuild がこの分野に手を出すときに、知識の摩擦を減らすためにどのように機能するかを理解することは、依然として良いことです。Web サイト用のパッケージを作成して CSPack に渡しますか? それとも、プロジェクト ファイルを解析してから、クレイジーな引数を CSPack に渡しますか? また、デバッガーで azure プロジェクトを実行すると、エミュレーターで実行され、csx フォルダー内のバイナリのみ (イメージなどではありません) が実行されます。それはどのように行うのですか?デプロイまでのライフサイクルを示した、Azure ビルド パイプラインの写真付きの説明をご覧いただければ幸いです。これは、バイナリのコピーが 2 つある理由も説明できます。また、Visual Studio に Azure プロジェクトの packageOnBuild のようなプロジェクト フラグがあり、copyOnly を実行したり、パッケージを作成したりするオプションがあれば、これはずっと簡単だったでしょう。食べ残しのケーキには意味がありません。編集: csproj に追加できる DeployOnBuild 設定があります。

最後に、前述したように、これの全体的な目的は、開発マシンで単体テストを実行できるように、エミュレーターをポイントできる csx フォルダーを取得することです。ビルド マシンで正式なパッケージングを行うので、Visual Studio では必要ありません。だから、本当に私は何もパッケージ化したくないし、これをすべて達成するためのより簡単な方法があることを望んでいました.

4

1 に答える 1

1

msbuild は azure プロジェクト ファイルを使用してビルドを実行するため、プロジェクト ファイルから多くの情報を取得できます。

cspack の場合は、ロール コードがコンパイルされ、パッケージ化できることを前提としています。cspack はプロジェクト ファイルに依存しないため、web\workerrole プロジェクトのコード パスの明示的な情報が必要です。csdef ファイルには、そのような情報は含まれていません。cspack を使用する場合は、お勧めします。そのドキュメントを見て、コマンド ライン (CopyOnly オプション) からエミュレーター展開用のパッケージを作成してみてください。正しい構文が見つかったら、それをビルド スクリプトに埋め込むことができます。

于 2013-08-08T06:11:06.273 に答える