2

私のソリューションには、次の 2 つのプロジェクトが含まれます。

  • MyNamespace.Web.UI
  • MyNamespace.Web.Core

UI は Core を参照し、Core は私のライブラリ以外には存在しない Foobar.dll を参照します。Visual Studio 2008 からビルドすると、予想どおり Foobar.dll が UI プロジェクトの Bin フォルダーにあります。ビルド前に存在しないことを確認しました。

しかし、NAnt からビルドするとそこにないため、ランタイム例外が発生します。NAnt タスクは次のようになります。

<target name="compile" depends="init">
    <exec program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"
       commandline="${solution.file} /m /t:Clean /p:Configuration=${project.config} /v:q" workingdir="." />
    <exec program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"
       commandline="${solution.file} /m /t:Rebuild /p:Configuration=${project.config} /v:q" workingdir="." />
</target>

VSでは、リリースモードとデバッグモードなどですべてをビルド、再構築、再構築しようとしましたが、常に同じです。Foobar.dll は Bin フォルダーにあります。NAnt ではそうではありません。また、NAnt スクリプトから /m スイッチを削除しようとしました。同じ結果です。

UI ではなく Core で参照される他の dll がいくつかあり、NAnt ビルド後に予想どおり Bin に表示されます。

私の回避策は、UI プロジェクトで Foobar.dll を参照することですが、それでは少しうんざりします。何がこれを引き起こす可能性がありますか?

(ちなみに、Foobar.dll は実際には NHibernate.ProxyGenerators.CastleDynamicProxy.dll です)

4

5 に答える 5

2

VSには、「ローカルコピー」をオンにするオプションがある可能性があります。これは、ビルド前にローカルにコピーすることを意味します。NAntでそれをエミュレートする必要があります。

Visual StudioからWebプロジェクトの「公開」を実行できる理由と同様ですが、コマンドラインでは、出力をビルドしてから、どこにでもコピーする必要があります。

于 2008-11-12T18:40:52.783 に答える
1

以前に NantContrib で MSBuild タスクを使用したことがありますが、ライブラリ dll を bin フォルダーにコピーしているように見えました。確かに、これはあなたのアプローチが機能しない理由を実際には説明していませんが、あなたの目標はそれを構築することであり、構築できない理由を理解することではないと思います

于 2008-11-12T18:35:39.173 に答える
0

私はコーリーに同意します。msbuild にシェルアウトしているため、サードパーティ (自分のものまたはそれ以外) の dll を必ず bin または出力フォルダーにコピーする必要があります。

タスクを実行する前に、nant でタスクを使用してこれを行うことができます。その後、すべてがうまくいくはずです。

唯一の落とし穴は、msbuild タスクを実行する前にどこに配置するかを知る必要があるため、最初にフォルダー構造を作成する必要があり、msbuild がそれを消去しないことを願うことです。

それが役立つことを願っています。

于 2009-02-12T22:22:03.980 に答える
0

私が取り組んだいくつかのことでは、プロジェクトがビルドされるように、NAnt のコピー タスクを使用して DLL を bin ディレクトリにコピーしました。それが必ずしもベストプラクティスかどうかはわかりませんが、うまくいきます。

于 2008-11-06T22:03:24.840 に答える
0

同様の問題がありました。明示的に追加することでこれを解決しました

<Private>True</Private>

コピーローカルを強制する.csprojファイルの参照内。

<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\lib\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
  <Private>True</Private>
</Reference>
于 2015-12-02T18:15:35.673 に答える