18

コマンド ラインから Visual Studio プロジェクトとソリューションをビルドするための MSBuild ツールの 260 文字の制限を克服する方法はありますか? CruiseControl を使用してビルドを自動化しようとしています (CruiseControl.NET はオプションではないため、通常の ant スクリプトに結び付けようとしています)。パスの長さに関する問題が引き続き発生します。明確にするために、ツールはパスを適切に折りたたまないため、問題はソリューション ファイルで参照されるプロジェクトのパスの長さにあります:(

また、DevEnv を使用してみましたが、これは動作することもあれば、例外をスローすることもあります。これは、別のマシンでの自動ビルドには適していません。したがって、これを代替品として使用することはお勧めしません。

さらに、通常の IDE から Visual Studio を使用すると、プロジェクトが正常にビルドされます。

4

8 に答える 8

11

MSBuild の制限のようです。私たちも同じ問題を抱えていましたが、適切に機能する解決策が他に見つからなかったため、最終的にパスを短縮する必要がありました。

于 2008-09-30T08:51:45.083 に答える
10

SUBST コマンドはまだ存在しているように見えるので、ビルド フォルダーのルートをドライブ文字に再マッピングすると、Judah Himango の解決策がうまくいかない場合に文字数を節約できる可能性があります。

于 2008-09-30T10:24:36.747 に答える
5

CSPROJファイルを調整して同様の問題を解決しました:

<BaseIntermediateOutputPath>$([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)\..\..\..\Intermediate\$(AssemblyName)_$(ProjectGuid)\'))</BaseIntermediateOutputPath>

その結果、コンパイル中に CSC.EXE は相対パスではなくフル パスを受け取ります。

CSC.EXE がパスでどのように動作するかについての手がかりを提供してくれた harrydev に感謝します。

于 2012-03-09T14:30:49.937 に答える
2

問題は、C# コンパイラ (csc.exe) が呼び出されたときに、プロジェクトのディレクトリ パス PROJECTDIRECTORY と出力パス OUTPUTPATH を次のように追加するだけで使用することであることがわかりました。

プロジェクト ディレクトリ + 出力パス

ただし、OUTPUTPATH が「..\..\Build\ProjectName\AnyCPU_Debug_Bin\」などの相対パスで、プロジェクト ディレクトリがかなり長い場合、パスは次のようになるため、合計の長さは 259 文字より長くなります。

PROJECTPATH+"..\..\Build\ProjectName\AnyCPU_Debug_Bin\"

絶対パスの代わりに。

csc.exe が Win32 関数を呼び出す前に絶対パスを作成する場合、これは機能します。この場合、絶対パスの長さは 160 文字未満です。

何らかの理由で、Visual Studio からの csc.exe の呼び出しは、Visual Studio からの呼び出しと MSBuild では異なります。なぜだか分からない。

いずれの場合も、PROJECTDIRECTORY および/または OUTPUTPATH パスのいずれかまたは両方を変更することで問題を解決できます。

于 2011-10-07T12:08:59.117 に答える
2

ビルドに関連する 2 種類のロング パス問題があります。1 つは、あまり長くないパスですが、「..\」がたくさん含まれているパスです。通常、これらは参照の HintPath 値です。MSBuild は、これらのパスが機能するように、これらのパスを最大制限未満に正規化する必要があります。

もう 1 つの種類のパスは、単純に長すぎます。申し訳ありませんが、これらは機能しません。かなり調べた結果、問題は、長いパスに対する十分な API サポートがないことです。BCL チーム (ブログを参照) にも同様の問題がありました。一部の Win32 API のみが \?\ 形式をサポートしています。任意のビルド ツール、そしておそらく世の中にあるアプリの 98% はそうではありません。さらに悪いことに、おそらく動作が悪くなります (MAX_PATH 用にサイズ設定されたすべてのバッファーを考えてください)。

長いパスを機能させるためのエコシステムの大規模な取り組みが行われるか、Windows がそれらを機能させる独創的な方法 (短いパスのマングリングなど) を考案するまでは、MSBuild で長いパスをサポートすることは不可能であるという結論に達しました。 . あなたが見つけたように、回避策にはsubstが含まれます。しかし、ツリーが単純に深すぎる場合、唯一の選択肢は、ツリーをフラグメントで構築するか、フォルダー名を短くすることです。ごめん。

ダン/MSBuild

于 2009-09-14T05:47:44.840 に答える
0

DOS パスを試しましたか? または \\?\ プレフィックス? 詳細については、.NET BCL チームのブログをご覧ください。

于 2008-09-26T15:40:10.720 に答える
0

すでに受け入れられている回答があることは知っていますが、使用中に別の問題が発生しmsbuildたため、同じエラー出力が発生し、円形の野生のガチョウの追跡につながりました。したがって、将来のグーグル社員のために、ここに行きます:

を呼び出すバッチ ファイルがありますmsbuildが、ビルド マシンは Visual Studio の複数のバージョンをビルドできるため、各バッチ ファイルはvcvarsall.bat実行前に を呼び出しますmsbuild。これには、パスが何度も同じものでいっぱいになるという厄介な副作用があります。いっぱいになると、上記の質問に示されているエラーが表示されますThe input line is too long.。単純な Google 検索では、パスが突然msbuild.

私の場合、セッションを強制終了しcmd.exeて再起動するだけで、環境変数がネイティブの状態に戻りました。

于 2013-09-11T13:23:30.330 に答える
0

パス長が 260 の場合、このエラーの 259 または 261 が発生しないため、参照を解決する警告があります。msbuild のバグがあると思います。

于 2013-08-09T09:35:12.423 に答える