我已经编写了一些 Windows 批处理文件来调用我们产品所包含的所有 VS 解决方案的 msbuild。
除了一个 SLN 之外,它们都可以工作,其中 CSPROJ 文件会导致问题。
这些项目都建立在VS2008中。
项目文件夹布局
\RootFolder
\LinqToXsd
-LinqToXsd.targets
-Xml.Schema.Linq.dll
\BL
-BL.csproj
\Config
-Config.csproj
我们已经定制了 CSPROJ 文件以引入 LinqToXsd:
将此行添加到第一行PropertyGroup
:
<LinqToXsdBinDir Condition="'$(LinqToXsdBinDir)' == ''">$(SolutionDir)\..\LinqToXsd</LinqToXsdBinDir>
而在Import
for之后的这条线Microsoft.CSharp.targets
<Import Project="$(LinqToXsdBinDir)\LinqToXsd.targets" />
命令行:
C:\Windows\Microsoft.NET\Framework64\v3.5\msbuild.exe /m /target:Build /nologo /property:BuildInParallel=true;OutDir=E:\Projects\BuildMaster\trunk\built\ConfigTool\;Configuration=Release /verbosity:minimal "*snip*\ConfigTool\ConfigTool.sln"
问题是,我们在输出中得到了这个:
*snip*\ConfigTool\ConfigTool.csproj(131,11): error MSB4019: The imported project "E:\LinqToXsd\LinqToXsd.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
ConfigTool.csproj : Solution file warning MSB4122: Scanning project dependencies for project "ConfigTool.csproj" failed. The imported project "E:\LinqToXsd\LinqToXsd.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. *snip*\ConfigTool\ConfigTool.csproj
*snip*\BL\BL.csproj(352,11): error MSB4019: The imported project "E:\LinqToXsd\LinqToXsd.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
..\BL\BL.csproj : Solution file warning MSB4122: Scanning project dependencies for project "..\BL\BL.csproj" failed. The imported project "E:\LinqToXsd\LinqToXsd.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. *snip*\BL\BL.csproj
C:\Windows\Microsoft.NET\Framework64\v3.5\Microsoft.Common.targets : warning MSB3245: Could not resolve this reference. Could not locate the assembly "Microsoft.Xml.Schema.Linq". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
然而,我还有其他项目使用这些线路并完美运行。包括引用相同 CSPROJ 文件的文件(共享 BL)。
我已经尝试删除所有 bin、obj、缓存、suo 和用户文件/文件夹,没有区别。
任何可以提供帮助的 msbuild 专家吗?
谢谢,
J1M。
更新1
如果我替换这一行:
<LinqToXsdBinDir Condition="'$(LinqToXsdBinDir)' == ''">$(SolutionDir)..\LinqToXsd</LinqToXsdBinDir>
有了这条线:
<LinqToXsdBinDir>$(MSBuildProjectDirectory)\..\LinqToXsd</LinqToXsdBinDir>
在 ConfigTool 和 BL 项目文件中,我不再收到关于 LinqToXsd 在编译 BL 时找不到的错误,尽管它找不到已编译的 BL dll。
解决方案
首先,SolutionDir 仅由 VS2008 定义,而不是 MSBUILD 似乎。您可以在命令行上传递它,但我选择执行以下操作:
<LinqToXsdBinDir>$(MSBuildProjectDirectory)\..\LinqToXsd</LinqToXsdBinDir>
MSBuildProjectDirectory
在 VS 和 MSBUILD 中都定义了。
二、不同的问题导致相同的症状(不知道为什么)
其中一个项目 (BL) 引用了下属 (SL) 并且 SL 的 GUID 已更改。这在 VS 中并不重要,但 MSBUILD真的不喜欢它。
删除和重新创建 refs 修复了第二个解决方案。
我只是在随机的 csproj 黑客攻击中才发现它,当时 MSBUILD 突然开始报告关于project {guid} referencing project {guid} which is not available in the SLN file
谢谢,
J1M