我正在尝试为我们的应用创建一个Wix安装程序。 Wix项目收获不起作用,因为它只将主exe文件复制到安装目录,所有dll等都不会被复制。
所以我想有一个构建应用程序并使用Wix输出的预构建事件。
问题是输出将包含.pdb,vchost.exe等文件。我可以配置构建以便它只输出所需的文件吗?
编辑:可在此处找到最终解决方案 https://github.com/AndersMalmgren/FreePIE/blob/master/BuildTools
首先查看 https://github.com/AndersMalmgren/FreePIE/blob/master/BuildTools/build_installer.bat
答案 0 :(得分:7)
当我创建任何类型的安装程序/ zip文件/我的项目时,我从未在"标准"在Visual Studio中构建,即在.csproj
文件中
(我知道您试图将预构建事件放在哪里 - 对吗?)
原因是我不想在我编程的每一个版本上重建安装程序/ zip。
我一直在做什么:
我创建了一个MSBuild project file,我可以从资源管理器手动执行(通常通过批处理文件),它编译Visual Studio解决方案,然后创建zip文件,安装程序,NuGet包或任何我需要的东西。
因此,创建设置完全取决于Visual Studio解决方案,但我可以从源代码控制中提取最新的更改,然后构建所有内容并通过单击创建设置。
(Joel Test,第二个问题:"您可以一步完成构建吗?")
当我不需要Visual Studio放入输出文件夹的所有内容时,我只是首先将我需要的文件复制到另一个文件夹中。
以下是我的某个项目的示例:
The MSBuild file
最后一段("将文件复制到发布文件夹")复制\bin\Release
文件夹的内容(但不包括*.pdb
和*.xml
文件)和来自根目录的一些文件文件夹到单独的"发布"目录:
<!-- copy files to release folder -->
<Target Name="CopyRelease">
<MakeDir Directories="$(ReleaseDir)"/>
<ItemGroup>
<ReleaseFiles
Include="$(OutDir)\**\*.*;
README.md;
License.rtf"
Exclude="$(OutDir)\*.pdb;
$(OutDir)\*.xml">
</ReleaseFiles>
</ItemGroup>
<Copy SourceFiles="@(ReleaseFiles)" DestinationFiles="@(ReleaseFiles -> '$(ReleaseDir)\%(RecursiveDir)%(Filename)%(Extension)')"/>
</Target>
The batch file that I use to execute the MSBuild file
批处理文件中有更多代码(用于处理版本号等内容),但执行MSBuild文件的重要部分是:
rem path to msbuild.exe
path=%path%;%windir%\Microsoft.net\Framework\v4.0.30319
rem go to current folder
cd %~dp0
msbuild build.proj
我实际上是使用WiX为这个项目构建安装程序,但是我没有使用&#34;收获&#34;你正在使用的功能(我之前不知道) 我只是在WiX project file中为安装程序指定了每个文件,然后我使用another batch file来构建项目(通过调用上面提到的第一个批处理文件)然后WiX设置。
即使我对实际WiX工具的使用与您的不同,您仍然可以使用类似于上述方法的方法来创建&#34;源文件夹&#34;对于WiX的收获功能:
调用批处理文件,将所需文件准确复制到其他文件夹,然后使用 作为源来创建安装程序。
如果您不想创建MSBuild文件,您甚至可以使用Robocopy之类的内容(它可以镜像一个完整的文件夹,但不包括某些文件扩展名)。
修改强>
尝试构建完整的解决方案,而不仅仅是一个项目
将包含以下内容的批处理文件放在.sln
文件所在的文件夹中:
set PATH=%PATH%;%WINDIR%\Microsoft.Net\Framework64\v4.0.30319
rem go to current folder
cd %~dp0
msbuild YourSolution.sln /p:Configuration=Release
第二个错误说明PreBuildEvent target
- &GT;您是否已经在.csproj
的预制活动中添加了一些内容?也许这不起作用。
<强> EDIT2:强>
我做了类似的事情:
我只有batch file将版本号(在我的情况下是硬编码的)放入环境变量中,在进行实际构建之前,我从main build batch调用该批处理文件。
在我的.csproj
中,我有一个pre-build event,它将程序集版本号设置为环境变量中的值(如果存在),否则只设置为0.0
。
(当我从Visual Studio构建时,我不关心版本号 - 我使用批处理文件创建所有版本构建,因此我只需要版本号)
编辑3:
最后一步,将整个输出输入Wix,链接每个文件,这在mu项目中并不实际。它的几个子文件夹和数千个文件。关于如何在wix中链接整个输出文件夹的任何好主意?
对不起,我以前从未尝试过这个。使用WiX的正确方法是to build the setup incrementally right from the beginning。
从链接引用(我强调):
将所有数百或数千个组件键入WiX 当然,源文件提出了另一个挑战。该工具集有一个 small utility可以帮助解决这个问题(稍后会详细介绍),但是 真正的解决方案是概念上的改变停止考虑设置 程序作为一个单独的应用程序,必须急于写 当主应用程序已经完成时。作为WiX源文件 并且工具集本身可以集成到您的开发中 环境很容易,你应该始终保持同步。尽快 当您开始处理新模块或添加新的注册表引用时 在您的程序中,同时修改相应的WiX源文件 时间。这样,设置将与。一起完成 应用程序本身并没有必要提取所有文件 以及稍后安装所需的其他信息。 由于WiX项目可以模块化(稍后会详细介绍),这个 如果你有一个庞大的团队工作,那么方法也可以 应用程序而不是单个开发人员。
link in the quoted text指向描述Heat
工具的页面,该工具似乎是&#34;收获&#34;你之前提到的工具已经尝试过但没有成功。