clickonce引导程序和msbuild出现问题

clickonce引导程序和msbuild出现问题,msbuild,clickonce,winapi,Msbuild,Clickonce,Winapi,我有一个运行在WindowsServer2003上的CruiseControl.NETBuild服务器,我正在尝试使用msbuild构建和发布ClickOnce应用程序 一切正常,除了启用ClickOnce应用程序的引导程序。发生这种情况时,我在部署GenerateBottrapper目标中得到以下错误: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3939,9): error MSB3147:

我有一个运行在WindowsServer2003上的CruiseControl.NETBuild服务器,我正在尝试使用msbuild构建和发布ClickOnce应用程序

一切正常,除了启用ClickOnce应用程序的引导程序。发生这种情况时,我在部署GenerateBottrapper目标中得到以下错误:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3939,9):

error MSB3147: 

Could not find required file 'setup.bin' in 'E:\Projects\src\TestProject\Engine'.
服务器上安装了.NET Framework 3.5 SP1和4以及这两个版本的最新Windows SDK,但C:\Program Files\Microsoft SDK\Windows\versionNo\中的引导程序文件夹不存在。我试图从我的工作站复制文件,但没有成功

我不想在服务器上安装Visual Studio,只想安装必要的SDK


我还试着从我的机器上复制bootsrapper文件夹

C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper

C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper
建立服务器,但没有运气


有什么想法吗?

您还必须将关联的键和值添加到注册表中,以允许MSBuild找到引导程序文件夹的路径。我可以使用下面的regedit确认这对我有效

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\4.0]
@="0"
"Path"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bootstrapper\\"
更新:根据Emma的TFS博客,似乎检查了以下注册表值以查找引导程序路径,如果未找到,则在本地项目文件夹的引擎子文件夹下查找,如果未找到,则使用MSB3147错误退出

  • HKLM\Software\Microsoft\GenericBootstrapper\\
  • HKLM\Software\Microsoft.NetFramework\SDKInstallRoot\Bootstrapper
  • HKLM\Software\Microsoft\VisualStudio\\InstallDir\Bootstrapper
  • 提醒:还请记住,有一个32位和64位注册表,因此请确保将此值添加到工具将访问的同一注册表中

    同时,我还创建了一个解决方案,以便为这个问题找到更合理的解决方案。请投票表决我的功能请求,让微软看看它

    顺便说一句,这里还有一些关于这个问题的链接:


    您还可以将引导程序包的位置传递给公共
    发布
    目标,如下所示:

    <PropertyGroup>
         <BootstrapperSdkPath>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Bootstrapper</BootstrapperSdkPath>
    </PropertyGroup>
    
    
    C:\ProgramFiles(x86)\Microsoft SDK\Windows\v8.0A\Bootstrapper
    
    然后

    <Target Name="Publish">
        <MSBuild Targets="publish" ... Properties="GenerateBootstrapperSdkPath=$(BootstrapperSdkPath); ..."/>
    </Target>
    

    我在win7 x64机器上也遇到了同样的问题。我尚未安装Visual Studio,并尝试构建和发布.NET 4.5 WPF解决方案。我必须将以下键添加到注册表中

    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\GenericBootstrapper\11.0]
    "Path"="C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.1A\\Bootstrapper\\"
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\GenericBootstrapper\4.0]
    "Path"="C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.1A\\Bootstrapper\\"
    

    您还需要从您的开发人员机器上复制引导程序文件夹。这篇博文将我引向了正确的方向

    我也遇到了类似的问题,但在我的案例中,我确实在盒子上安装了Visual Studio,并且从Visual Studio发布效果很好。 使用msbuild.exe从命令行发布时,生成失败,出现上述错误“MSB3147找不到所需的文件“setup.bin”

    解决方案是明确指定在构建过程中使用哪个版本的VisualStudio

    <MSBuild
      Projects="MyProject.csproj"
      Targets="publish"
      Properties="Configuration=Release;PublishUrl=C:\AnyFolder;VisualStudioVersion=12.0"/>
    
    
    

    我在Win7 x64机器上安装了Visual Studio 2013。我对这个问题的理解是,MSBuild在注册表中找错了位置。通过明确告诉MS Build使用VS 12.0,它选择了正确的注册表位置条目,从而选择了BootstrapperSdkPath的正确路径。

    我通过TeamCity Build服务器遇到了同样的错误。本例中的原因是,我正在对.sln文件运行MSBuild任务,目标为“MyProject:publish”。在本例中,解决方案+projecth已更新为目标.NET v4.5,但生成服务器仍配置为使用MSBuild Tools 4.0和.NET v4.0


    我花了一点时间来解决工作分支构建和非工作分支构建之间的不一致性。

    我在脚本中添加了这一行。这有帮助

    call "%VS120COMNTOOLS%vsvars32.bat"
    

    Visual Studio 2013,SDK v8.1A。

    我可以通过从该位置指向MSBuild.exe来解决此问题

    C:\ProgramFiles(x86)\MSBuild\12.0\Bin\MSBuild.exe

    之前我指的是

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe


    嗨,我知道这个答案很晚了,只是以防万一

    我必须将路径道具添加到任务中,其中包含引导程序所在的路径,在我的示例中,我使用了Visual Studio 2015,因此路径为:

    **程序文件(x86)\Microsoft Visual Studio 14.0\SDK\Boostrapper**

    在我的例子中,MSBuild有一个任务生成器bootstrapper

        <GenerateBootstrapper> 
           AplicationFile="$(AppName)"
           ApplicationName=..
           ApplicationUrl=..
           BootstrapperItems=..
           Culture=..
           ApplicationUrl=.. 
           Path="Program Files(x86)\Microsoft Visual Studio 14.0\SDK\Boostrapper\"
        </GenerateBootstrapper>
    
    
    AplicationFile=“$(AppName)”
    应用程序名=。。
    应用程序URL=。。
    BootstrapperItems=。。
    文化=。。
    应用程序URL=。。
    Path=“程序文件(x86)\Microsoft Visual Studio 14.0\SDK\Boostrapper\”
    
    通过这种方式,MSBuild能够识别并生成该文件


    现在我被.NET4引导程序绊倒了,但猜是另一回事

    我自己也在挣扎——我选择将引导程序文件提交给源代码管理。可以覆盖引导程序的路径,只需提供
    /p:GenerateBootstrapperSdkPath=.build\Bootstrapper

    这样就不需要修改注册表了,而且增加的好处是构建现在是自包含的


    唯一的“问题”是我必须手动将引导程序文件复制到源代码管理中。在我的例子(VStudio2015)中,这意味着从
    C:\ProgramFiles(x86)复制文件\Microsoft Visual Studio 14.0\SDK\Bootstrapper

    我也尝试过从我的计算机C:\Program Files\Microsoft SDK\Windows\v6.0A\Bootstrapper C:\Program Files\Microsoft SDK\Windows\v7.0A\Bootstrapper复制Bootstrapper文件夹来构建服务器,但运气不佳。我尝试了4个小时后,这个解决方案对我有效:在64位上系统注册表项位于HKLM\Software\Wow6432Node\Microsoft \-see下。在花了无数个小时尝试解决此问题的其他解决方案后,此方法成功且非常简单。谢谢