如何基于每个用户禁用MSBuild的<RegisterOutput>目标?

Rog*_*mbe 6 msbuild

我喜欢以普通(非管理员)用户身份进行开发.我们的VS2010项目构建失败,"无法注册输出.请尝试启用每用户重定向或使用提升的权限从命令提示符注册组件."

由于我无权更改项目文件,是否有任何方法可以添加特定于用户的MSBuild目标或属性,以便在特定计算机或特定用户上禁用此步骤?我不想破解核心的MSBuild文件.

我不想更改项目文件,因为我可能会意外地重新检入它.我也不想破解MSBuild核心文件,因为它们可能被服务包覆盖.

鉴于Visual C++项目文件(以及相关的.targets和.props文件)有大约一百万个位置来改变构建顺序并导入任意文件,我希望能够提供这些内容.

MSBuild导入/评估项目文件如下(我只看了我感兴趣的分支):

Foo.vcxproj
  Microsoft.Cpp.Default.props
  Microsoft.Cpp.props
  $(UserRootDir)\Microsoft.Cpp.$(Platform).user.props
  Microsoft.Cpp.targets
    Microsoft.Cpp.$(Platform).targets
      ImportBefore\*
      Microsoft.CppCommon.targets
Run Code Online (Sandbox Code Playgroud)

"RegisterOutput"目标定义于Microsoft.CppCommon.targets.我希望通过在其中放入一个"无操作"的"RegisterOutput"目标来取代它$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props,即%LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props(Microsoft.Cpp.Default.props如果尚未设置UserRootDir,则设置为UserRootDir ).

不幸的是,MSBuild使用最后定义的目标,这意味着我的目标会被内置目标覆盖.

或者,我可以尝试设置%(Link.RegisterOutput)元数据,但我必须对所有Link项目执行此操作.知道如何做到这一点,或者即使它会起作用吗?

madgnome建议我可以在.vcxproj.user文件中执行某些操作.不幸的是,它直接包含在构建过​​程的开始,这意味着替换目标将无法工作.

Jul*_*rau 1

最终测试解决方案

RegisterOutput 在$(BuildLinkTargets) ( Microsoft.CppBuild.targets )定义的链接过程中被调用,如下所示:

<BuildLinkTargets Condition="'$(ConfigurationType)'!='Utility'">
  $(BuildLinkTargets);
  _Link;
  _ALink;
  _Manifest;
  RegisterOutput;
  _XdcMake;
  _BscMake;
</BuildLinkTargets>
Run Code Online (Sandbox Code Playgroud)

如果您不想执行 RegisterOutput 您只需删除 BuildLinkTargets 定义中的这一步:

<PropertyGroup>
    <BuildLinkTargets Condition="'$(ConfigurationType)'!='Utility'">
      $(BuildLinkTargets);
      _Link;
      _ALink;
      _Manifest;
      _XdcMake;
      _BscMake;
    </BuildLinkTargets>
Run Code Online (Sandbox Code Playgroud)
  • 如果您不想对一个项目执行 RegisterOutput ,则需要在文件中覆盖它:PROJECT_NAME.vcxproj.user(在您的项目文件旁边,该文件是特定于用户和项目的)
  • 如果您不想在所有项目中执行 RegisterOutput ,则需要在文件中覆盖它:$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props(此文件是用户特定的)