我喜欢以普通(非管理员)用户身份进行开发.我们的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文件中执行某些操作.不幸的是,它直接包含在构建过程的开始,这意味着替换目标将无法工作.
最终测试解决方案
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)