2017-06-14 58 views
2

我已经创建了一个构建后事件,以在使用以下构建脚本成功构建之后对应用程序执行代码签名。如何在没有硬编码路径的Visual Studio 2013的后期构建事件中使用signtool?

copy $(TargetPath) $(TargetDir)SignedApp.exe 
signtool sign /t http://timestamp.verisign.com/scripts/timestamp.dll /a $(TargetDir)SignedApp.exe 

我得到错误“signtool”不被识别为一个内部或外部的命令。 所以看起来用于构建事件的路径并不指向signtool实用程序。当我运行VS2013的x86原生工具命令提示符我可以运行signtool,因为它包含指向一个路径:

C:\Program Files (x86)\Windows Kits\8.1\bin\x86 

我可以硬编码路径到编译事件

"C:\Program Files (x86)\Windows Kits\8.1\bin\x86\signtool" sign /t http://timestamp.verisign.com/scripts/timestamp.dll /a $(TargetDir)SignedApp.exe 

但是,这似乎不可移植。如何获得为本机命令提示符定义的相同路径,以供我的构建后事件使用,而无需对其进行硬编码?我查看了宏列表,但没有发现任何有用的东西。

+0

1.在你的repo中包含signtool 2.包含一个通过为你定位signtool进行签名的exe,也许https://github.com/Microsoft/vswhere可以帮助 3.安装一个构建服务器,固定路径(这是我最终做的) 4.添加一个不在您的VCS中的批处理文件,每个用户必须编辑(理想情况下一次) –

回答

4

溶液我决定为:

REM If SIGNTOOL environment variable is not set then try setting it to a known location 
if "%SIGNTOOL%"=="" set SIGNTOOL=%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86\signtool.exe 
REM Check to see if the signtool utility is missing 
if exist "%SIGNTOOL%" goto OK1 
    REM Give error that SIGNTOOL environment variable needs to be set 
    echo "Must set environment variable SIGNTOOL to full path for signtool.exe code signing utility" 
    echo Location is of the form "C:\Program Files (x86)\Windows Kits\8.1\x86\bin\signtool.exe" 
    exit -1 
:OK1 
echo Copying $(TargetFileName) to $(TargetDir)SignedApp.exe 
copy $(TargetPath) $(TargetDir)SignedApp.exe 
"%SIGNTOOL%" sign /t http://timestamp.verisign.com/scripts/timestamp.dll /a $(TargetDir)SignedApp.exe 

这是上@Dennis凯珀斯建议#4的变化。开发人员必须将环境变量SIGNTOOL设置为正确的位置。如果他们不这样做,则尝试一个已知的可能位置。如果失败,则会报告错误,指示他们适当地设置SIGNTOOL env var。

我没发现有一个环境变量WindowsSdkDir

WindowsSdkDir=C:\Program Files (x86)\Windows Kits\8.1\ 

但同样,这只是运行本地命令提示符时设置,从而在运行后生成事件脚本时没有定义。

0

我在Visual Studio 2012中遇到了同样的问题,并找到了解决此问题的更简单的方法。而不是启动Visual Studio直接启动“VS2012开发人员命令提示符”,然后在命令提示符下键入“devenv”以启动Visual Studio。之后,signtool为我工作得很好。

+0

我用这个解决方案看到的问题是,当另一个开发人员出现时也许几年后),并试图建立这个项目,它会失败,没有任何迹象表明他们做错了什么。这需要一个非常规的方法来启动VS,并且它要求开发人员知道总是以这种方式启动VS。我认为我更喜欢我的解决方案,因为它向开发人员反馈当事情不起作用时应该怎么做,并且一旦设置了环境变量,VS就可以以传统方式启动。 – JonN

相关问题