我正在为VS 2017更新一个旧的Visual Studio扩展。它可以在我的本地计算机上从Visual Studio和msbuild进行调试和发布。
这是我正在使用的msbuild命令行:
msbuild VxCop.sln /p:ToolsHome=C:\ProgramData\chocolatey\bin /p:Configuration=Release /p:Platform="Any CPU"
但是,在使用相同命令行调用msbuild.exe的构建计算机(TFS Build 2010)上,它失败并显示this error
为了解决这个问题,我试图指定VSToolsPath。我尝试过各种各样的事情,例如改变.csproj中的VSToolsPath条目(这似乎没有考虑到因为这样做没有效果)并且还在命令行上传递它:
msbuild VxCop.sln /p:ToolsHome=C:\ProgramData\chocolatey\bin /p:Configuration=Release /p:Platform="Any CPU" /p:VSToolsPath=Packages\Microsoft.VSSDK.BuildTools.15.1.192\tools\
这会导致一个非常奇怪的错误:
CopyFilesToOutputDirectory:
Copying file from "obj\Release\SymCop.dll" to "bin\Release\SymCop.dll".
SymCop -> H:\src\tools\VisualStudioExtensions\Main\VxCop\source\SymCop\bin\Release\SymCop.dll
Copying file from "obj\Release\SymCop.pdb" to "bin\Release\SymCop.pdb".
Done Building Project "H:\src\tools\VisualStudioExtensions\Main\VxCop\source\SymCop\SymCop.csproj" (default targets).
Done Building Project "H:\src\tools\VisualStudioExtensions\Main\VxCop\VxCop.sln" (Build target(s)) -- FAILED.
Done Building Project "H:\src\tools\VisualStudioExtensions\Main\VxCop\build.proj" (default targets) -- FAILED.
Build FAILED.
0 Warning(s)
0 Error(s)
实际的扩展项目根本没有出现在日志中,并且没有,你知道,错误。但构建返回失败,返回代码非零,并且似乎没有构建vsix项目(缺少输出)
希望有人有一些建议
由于
编辑:
对于将来阅读此内容的人来说,问题似乎是同一个文件中有<Import>
进一步向下,而不关心我对$(VSToolsPath)
的更新。
更改导入修复了它:
<Import Project="$(SolutionDir)\packages\Microsoft.VSSDK.BuildTools.15.1.192\tools\VSSDK\Microsoft.VsSDK.targets"
/>
答案 0 :(得分:3)
Visual Studio 2017扩展 - VSToolsPath无法正常工作
我根据您的脚本获得了与您相同的结果。将NuGet包<img *ngIf="imageUrl" [src]="imageUrl">
安装到项目后,Microsoft.VSSDK.BuildTools
将导入到项目文件中,打开项目文件,您可以在下面找到Microsoft.VSSDK.BuildTools.props
:
Import
然后打开这个道具文件,你可以注意下面的脚本片段:
<Import Project="..\packages\Microsoft.VSSDK.BuildTools.15.1.192\build\Microsoft.VSSDK.BuildTools.props" Condition="Exists('..\packages\Microsoft.VSSDK.BuildTools.15.1.192\build\Microsoft.VSSDK.BuildTools.props')" />
在这种情况下,NuGet包会使用<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="VSSDK_NuGet_Configuration">
<ThisPackageDirectory>$(MSBuildThisFileDirectory)..\</ThisPackageDirectory>
<VSToolsPath>$(ThisPackageDirectory)\tools</VSToolsPath>
<VsSDKInstall>$(VSToolsPath)\VSSDK</VsSDKInstall>
<VsSDKIncludes>$(VsSDKInstall)\inc</VsSDKIncludes>
<VsSDKToolsPath>$(VsSDKInstall)\bin</VsSDKToolsPath>
</PropertyGroup>
</Project>
覆盖值VSToolsPath
。因此,MSBuild将跳过在项目文件的下一步中设置值设置:
$(ThisPackageDirectory)\tools
由于NuGet已设置值 <PropertyGroup>
<MinimumVisualStudioVersion>15.0</MinimumVisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
,因此$(VSToolsPath)
的值将为 False 。此外,您可以添加目标以检查是否设置了值,例如:
Condition="'$(VSToolsPath)' == ''"
您会发现此值设置为:
<Target Name="CheckVSToolsPath" BeforeTargets="Build">
<Message Text="$(VSToolsPath)"></Message>
</Target>
上面的摘要,C:\Users\Admin\Documents\Visual Studio 2017\Projects\VSIXProject2\packages\Microsoft.VSSDK.BuildTools.15.1.192\build\..\\tools
的值已正确导入,我们无需在命令行上传递它。
经过深入调查,我发现上次错误的原因“MSB4226:导入的项目”(...)\ VSSDK \ Microsoft.VsSDK.targets“未找到”。是“VisualStudioVersion”的MSBuild属性未在构建服务器上设置。
请参阅以下链接了解详细信息Building a VSIX extension with the Visual Studio 2017 Build Tools:
具有完整Visual Studio 2017的计算机所执行的操作以及使用Build Tools 2017的计算机在打开开发人员命令提示符时执行的操作。由于我没有使用它,我将它作为参数传递给MSBuild脚本。它也可以在.csproj文件中定义,这是以前Visual Studio版本自动执行的操作,但最新版本没有。
因此要解决错误“MSBuild4226”,您应该在命令行上传递visual studio版本:
VSToolsPath
使用此命令行后,错误MSBuild 4226已解决。
希望这有帮助。