4

MSbuild を使用して、プロジェクトの 1 つでコマンド ライン ビルドを実行しようとしています。ソリューションとプロジェクトは VS2012 で正常にビルドされますが、次を含むバッチ ファイルを実行すると

msbuild.exe project.csproj

失敗します。エラーが多すぎて、上にスクロールすることさえできません。それらはすべて、ソリューション内の他のプロジェクトからの異なるファイルに対して、すべて同じエラーです。

CSC : error CS2001: Source file 'folder\filename.cs' cound not be found [c:\folder\project.csproj]

ファイル名の長さについて話している他の質問を見つけました。可能な限りパス内のすべてのレイヤーを削除しようとしましたが、役に立ちませんでした。見つけられないファイルが実際には他のプロジェクトからのものであるにもかかわらず、ソースファイルパスが相対的ではないのは奇妙です。私はここで少し途方に暮れています。ビルドが失敗するのはなぜですか?

4

2 に答える 2

1

プロジェクトがソリューション用に作成されたかのように聞こえるため、ソリューションの外部でビルドしようとすると、ソリューションがすべてのプロジェクトの場所を解決する接着剤であるため、プロジェクトが壊れます。

コマンド ラインからソリューションをビルドした場合、機能しますか?

msbuild.exe solutionname.sln

その場合は、Visual Studio を閉じて Notepad++ を開いて、XML の編集を開始する準備をしてください。

絶対パスの使用を排除し、ソリューション ルート フォルダーからの相対パスを優先します。

まず、参加リストのルートに「Common.props」という共通プロパティ フォルダーを作成し、次のマークアップを追加します。

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
    <PropertyGroup>
      <SlnRoot>$( [MSBuild]::GetDirectoryNameOfFileAbove( $(MSBuildThisFileDirectory), Common.props ) )</SlnRoot>
    </PropertyGroup>
</Project>

次に、このマークアップをすべてのメンバー プロジェクト ファイルに追加します。

<PropertyGroup>
  <CommonPropsFolder>$([MSBuild]::GetDirectoryNameOfFileAbove( $(MSBuildProjectDirectory) ,Common.props))</CommonPropsFolder>
</PropertyGroup>
<Import Project="$(CommonPropsFolder)\Common.props" />

(これは <Project /> ノードに続いて表示される最初の XML ノードである必要があります)

影響を受ける .csproj ファイル内のすべての <ProjectReference /> ノードを見つけます。参照を変更して、パスがソリューション ルートを基準とし、新しい $(SrcRoot) MsBuild プロパティのプレフィックスが付くようにします。

例: から

<ProjectReference Include="..\..\Tools\Build\Common.csproj">
  <Project>{deadbeef-dead-beef-dead-beefdeadbeef}</Project>
  <Name>Common</Name>
</ProjectReference>

<ProjectReference Include="$(SlnRoot)\Tools\Build\Common.csproj">
  <Project>{deadbeef-dead-beef-dead-beefdeadbeef}</Project>
  <Name>Common</Name>
</ProjectReference>

ここで、ソリューション名を指定してビルドできることをテストしてから、個々のプロジェクトに移動してコンパイルします。

于 2014-01-02T18:38:08.443 に答える