问题
I believe the problem is documented here moved here and looks like it might be a bug in visual studio, but I'm wondering if anyone knows of a workaround.
Basically I have the following two lines (among other things) one right after the other in the prebuild event.
"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "$(SolutionDir)Folder1\Project1.csproj"
"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "$(SolutionDir)Folder2\Folder3\Project2.csproj"
The first one succeeds and the other fails saying that The command ""C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "*Undefined*Folder2\Folder3\Project2.csproj"" exited with code 1.
.
Edit:
Figured out the problem was that one of the other projects with the same line as it's prebuild failed, since MSBuild itself doesn't know about the macros.
回答1:
I fixed this by replacing all $(SolutionDir)
with $(ProjectDir)..\
.
It was due to MSBuild running each project independently, and thus not the solution. It worked fine in VS2010, but not on the build server.
回答2:
You don't specify if this happens for many projects or just one or two.
If it is only in one or two projects, a temporary workaround might be to replace $(SolutionDir) with the explicit path that Folder2 is located in. For example, something like:
"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "C:\AllSolutions\ExampleSolutions\Folder2\Folder3\Project2.csproj"
but with the correct path for your project.
回答3:
Allan's answer is exactly on the right path, but if you want to move to parent directory of the ProjectDir
, or the $(ProjectDir)..\
output is going to be a string
, you need to perform the 'go to parent directory' operation in msbuild.
Here is how you can achieve this:
<PropertyGroup>
<TrimmedDir>$([System.IO.Path]::GetDirectoryName($(ProjectDir)))</TrimmedDir>
</PropertyGroup>
This code will set the parent directory path of the ProjectDir
to TrimmedDir
variable. [System.IO.Path]::GetDirectoryName()
performs this operation.
来源:https://stackoverflow.com/questions/635346/prebuild-event-in-visual-studio-replacing-solutiondir-with-undefined