使用Visual Studio安装程序项目将文件夹中的所有文件添加到安装程序中

5
我们有一个设置项目,目前从不同的Visual Studio项目中添加项目输出。我们想要更改打包系统,使用一个包含一堆准备好部署的部署文件的文件夹。
但这意味着我们需要逐个添加文件,并在每个版本上继续添加新文件。
我在这个问题中看到,我们无法像*.aspx这样使用规则添加文件。
因此,我考虑创建一个小工具,根据可用的文件更改vdproj文件。您能帮我确定该文件的格式吗?似乎每个包含的文件都有一些关联的GUID。
有没有更好的解决方案?
我们暂时不考虑使用其他设置工具,我们只是寻找一个简单的文件打包解决方案。
10个回答

7
我终于找到了这个问题的真正解决方案。我需要在构建时将给定外部目录中的所有文件(不是项目的一部分)添加到设置项目中,即如果在该外部目录中添加了一个文件,则它将在下次构建时自动包含在安装程序中。
我的做法是在解决方案中创建了一个新项目(类库项目),并从中删除了所有内容:Class1.cs、AssemblyInfo.cs以及包含上述文件的<Compile>元素和用于包含引用的<Reference>元素的相关ItemGroups。
然后,我添加了一个新的ItemGroup:
<ItemGroup>
  <Content Include="Path\To\The\Directory\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

这种方式,新项目不包含任何文件,但它引用从指定目录递归(由 \**\ 表示)寻找的所有文件作为内容文件

因此,在构建时,这些文件被视为内容文件,并复制到新项目的输出目录中。

那么,我为什么要做以上所有的事情?只是因为“安装程序项目”有一个选项可以包含另一个项目中的内容文件

这样一来,您就可以使任意外部文件“成为”解决方案的一部分,而无需实际列出这些文件,文件列表在构建时间进行评估,然后从安装程序项目中引用它们。


1
这与 https://dev59.com/eWkv5IYBdhLWcg3w_lzE#47738053 中所描述的 <Link>some\folder%(RecursiveDir)%(Filename)%(Extension)</Link> 结合使用,可以将文件放置在特定的输出文件夹中,并保留原始层次结构(否则所有文件都会被倾倒到输出根目录)。 - Etherman

7

要添加整个文件夹,只需打开Windows资源管理器窗口,然后将想要添加的所有文件拖放到文件系统视图中即可。


4
我们也遇到了这个问题。你不能进行拖放操作。但你可以在Windows资源管理器中找到所需内容,将这些项复制(包括子文件夹),然后返回VS Installer并将其粘贴,例如应用程序文件夹。
注意:如果需要创建自定义文件夹(例如c:\html),您也可以使用此方法,但必须先在左侧窗格中创建自定义文件夹(指定绝对路径作为目标),然后再次转到左侧窗格并粘贴。
这种方法适用于打包一组文件夹,但不会同步可能包含不同内容的文件夹!如果内容在部署之间发生更改,则必须重新复制/粘贴以使安装程序文件包含所有内容!

似乎其他人说“只需复制、拖放等”并没有真正理解这里的问题。问题在于包含外部文件夹的_实际_内容,该内容_未_包含在任何项目中,并且随时间变化。 - Peter
+1 在输出目录中使用Ctrl+C复制所有内容,然后使用Ctrl+V粘贴到“应用程序文件夹”是我以前让它正常工作的方法。选择“文件”或“程序集”会导致缺少文件并且无法正确构建。必须按照上述步骤每次进行操作。 - SwDevMan81

4

看起来这个问题没有容易的解决方案。 我们最终改变了安装工具,并使用Advanced Installer创建安装程序,它有一个很好的功能,可以在部署时同步文件夹中的文件。


2
您可以在资源管理器中右键单击文件夹,然后单击复制,然后在安装程序中的文件系统视图中右键单击文件夹,然后单击粘贴。对我来说,拖放并不起作用。

1

你能否使用宏将文件夹中的所有文件添加进来?

另外,也许你可以使用宏或插件清除安装项目中的文件,并使用相同的方法添加文件夹中的文件。


这可能是一个解决方案。 我不太了解VStudio上的宏,所以有两个问题: -更改宏以浏览文件系统有多容易? -我可以从命令行运行宏,以便可以自动运行它吗? - pauloya
宏只是像其他函数一样在IDE上执行操作的函数。因此,是的,您可以添加浏览功能。 至于命令行,我不知道,也不认为可以,因为它存在于IDE内部。 - gbianchi

0
以下方法非常完美:只需将文件夹拖放到安装目录中(使用Windows资源管理器而不是解决方案资源管理器)。然后它将添加其中的所有文件和子文件夹。

0

我有同样的问题。虽然不是理想的解决方案,但我想到一个办法,就是有一个批处理文件将文件压缩成zip格式,然后我的安装程序只需分发该zip文件。之后,您需要在安装后解压缩它们。

或者,您可以编写一个小应用程序将它们压缩成单个文件,并在应用程序第一次运行时解压缩它们。基本上是相同的解决方案,只是您自己编写它,因此无需使用第三方解压缩工具,而且安装过程会更加简洁。

我认为我很快就会为我的项目采用后者的解决方案,因为我还没有准备好花大钱购买更好的安装程序。


-1

哦,不错,你可以在 VS 中将文件和文件夹拖放到安装目录中


您也可以在注释中表达相同的内容。 - Chintan Khetiya

-1
  1. 在Windows资源管理器中,您可以右键单击需要复制的文件夹,然后单击Ctrl+A或选择所有文件并单击复制。
  2. 在FileSystem编辑器中,导航到左侧。然后右键单击应用程序文件夹,单击添加并选择文件夹。
  3. 为文件夹命名
  4. 在FileSystem编辑器的右侧,右键单击并选择粘贴
  5. 文件夹中的所有内容都将复制到第2步中新创建的文件夹中。

有关更多信息,请参阅以下链接 https://dzone.com/articles/creating-msisetup-package-c


这是一个简单直接的手动解决方案,不需要任何宏。此外,在这种情况下拖放功能无法使用。 - jo_Veera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接