【问题标题】:Visual Studio 2017 extension - VSToolsPath not workingVisual Studio 2017 扩展 - VSToolsPath 不起作用
【发布时间】:2017-10-04 19:01:40
【问题描述】:

我正在为 VS 2017 更新旧的 Visual Studio 扩展。它可以从 Visual Studio 和 msbuild 中正常编译,并在我的本地计算机上进行调试和发布。

这是我正在使用的 msbuild 命令行:

msbuild VxCop.sln /p:ToolsHome=C:\ProgramData\chocolatey\bin /p:Configuration=Release /p:Platform="Any CPU"  

但是,在构建机器 (TFS Build 2010) 上使用相同的命令行调用 msbuild.exe 失败并显示 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" 
 />

【问题讨论】:

    标签: visual-studio msbuild visual-studio-2017 visual-studio-extensions


    【解决方案1】:

    Visual Studio 2017 扩展 - VSToolsPath 不起作用

    根据您的脚本,我得到了与您相同的结果。将 NuGet 包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')" />
    

    然后打开这个props文件,你可以看到下面的脚本sn-p:

    <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>
    

    在这种情况下,NuGet 包会使用 $(ThisPackageDirectory)\tools 覆盖值 VSToolsPath。所以MSBuild会skip在工程文件的下一步设置值设置:

      <PropertyGroup>
        <MinimumVisualStudioVersion>15.0</MinimumVisualStudioVersion>
        <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
        <NuGetPackageImportStamp>
        </NuGetPackageImportStamp>
      </PropertyGroup>
    

    因为 NuGet 已经设置了值$(VSToolsPath),所以Condition="'$(VSToolsPath)' == ''" 的值将是False。另外,您可以添加一个目标来检查是否设置了值,例如:

      <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
    

    以上总结VSToolsPath的值已经正确导入,我们不需要在命令行中传递。

    经过深入调查,找到了之前报错“MSB4226: The importing project "(...)\VSSDK\Microsoft.VsSDK.targets" is not found.”的原因。是没有在构建服务器上设置“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 版本:

    msbuild VxCop.sln /p:ToolsHome=C:\ProgramData\chocolatey\bin /p:Configuration=Release /p:Platform="Any CPU" /p:VisualStudioVersion=15.0
    

    使用此命令行后,错误 MSBuild 4226 已解决。

    希望这会有所帮助。

    【讨论】:

    • 谢谢利奥。我确实尝试添加该参数,但无济于事。问题是 Visual Studio 版本被插入到构建机器上不存在的路径中,因为构建机器只有 VS Build Tools 显然不会创建该路径。编辑:明天我回到办公室时会提供更多详细信息,但解决方法是在文件的下方找到实际导入并将其更改为不关心 VSToolsPath (基于 $(SolutionDir)\packages )。再次感谢
    【解决方案2】:

    我在 VS 2019 中通过 https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#generatepathproperty 解决了这个问题

    <ItemGroup>
      <PackageReference Include="Microsoft.VSSDK.BuildTools" Version="16.10.1055">
        <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        <PrivateAssets>all</PrivateAssets>
      </PackageReference>
    </ItemGroup>
    <Import Project="$(PkgMicrosoft_VSSDK_BuildTools)\tools\vssdk\Microsoft.VsSDK.targets" />
    

    【讨论】:

      猜你喜欢
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多