出于某种原因,我们有一个脚本可以创建批处理文件,以将我们编译的程序集、配置文件和各种其他文件 XCOPY 到网络共享中,以供 Beta 测试人员使用。我们确实有安装程序,但有些安装程序没有运行安装程序所需的权限,或者它们在 Citrix 上运行。

如果您一提到 XCOPY 和 Citrix 就吐得满桌子都是,那就以此为借口早点回家。不客气。

该代码目前有数百行,例如:

CreateScripts(basePath, "Client", outputDir, FileType.EXE | FileType.DLL | FileType.XML | FileType.CONFIG);

过去情况更糟,有 20 个 int 参数(每种文件类型一个)代表是否将该文件类型复制到输出目录。

这数百行创建了包含数千 XCOPY 行的上传/下载批处理文件。在我们的设置项目中,我们可以引用“来自客户端的主要输出”和“来自客户端的内容文件”等内容。我希望能够从非设置项目中以编程方式执行此操作,但我不知所措。

显然,MS 是通过使用 API 或解析 .csproj 文件来做到这一点的。我该怎么做呢?我只是在寻找一种方法来获取任何安装类别的文件列表,即:

  • 主输出
  • 本地化资源
  • 内容文件
  • 文档文件

编辑: :我有一个像哈斯建议的设置项目,它是我正在寻找的一半。阻碍其成为完美解决方案的唯一问题是多个项目依赖于各自文件夹中的相同程序集,并且安装程序只会复制文件一次。

例子:

项目Admin、Client和Server都依赖于ExceptionHandler.dll,并且Admin和Client都依赖于Util.dll,而Server则不依赖。这就是我正在寻找的:

  • 行政
    • 管理员程序
    • 管理员.exe.配置
    • 异常处理程序.dll
    • 实用程序.dll
  • 客户
    • 客户端程序
    • 客户端.exe.config
    • 异常处理程序.dll
    • 实用程序.dll
  • 服务器
    • 服务器程序
    • 服务器.exe.配置
    • 异常处理程序.dll

由于引用的程序集都是相同的,我得到的是这样的:

  • 行政
    • 管理员程序
    • 管理员.exe.配置
    • 异常处理程序.dll
    • 实用程序.dll
  • 客户
    • 客户端程序
    • 客户端.exe.config
  • 服务器
    • 服务器程序
    • 服务器.exe.配置

当客户端或服务器找不到它所期望的两个 DLL 之一时,这会导致 FileNotFoundException。

我是否缺少一个设置属性来使其始终复制输出,即使它在另一个项目的输出中的其他地方重复?

再次编辑: :所有引用的 DLL 都设置为“复制本地”,而且一直如此。我找到了一篇不错的文章 使用 NAnt 和 XSLT 获取文件列表, ,所以这也可能是一个可能的解决方案,正如 neouser99 所建议的那样。

接受的解决方案: :我几乎回到了起点。所有 .exe 和 .dll 输出都放入安装项目中的“bin”目录中,松散打包。其他每个应用程序文件夹包含该目录中可执行文件的快捷方式。

现在的区别是,我将向安装程序添加自定义操作以使用反射,枚举每个可执行输出的依赖项,并将 .exe 和 .dll 文件复制到单独的目录。有点痛苦,因为我只是假设有一种方法可以通过某些安装库以编程方式检测将包含哪些文件。

有帮助吗?

解决方案

为什么不使用另一个安装项目并将“包文件”设置设置为松散未压缩文件(安装项目->属性)?然后共享文件夹..或者其他的东西。

编辑:

我明白了,您有 3 个用于输出的文件夹。但安装项目只检测 ExceptionHandler.dll 和 Util.dll 一次,因此它只会选择第一个文件夹并将其放入其中。

你可以为每个项目做一个设置项目 - 也许有点烦人..

您可以通过添加“添加文件”或“添加汇编”或“添加项目输出”来手动将DLL中的DLL添加到缺少汇编的项目中,如果您将这些项目在同一解决方案中。(但我怀疑情况确实如此)。

或者将它们全部转储到一个输出目录中...

其他提示

尽管它被设计为构建工具,但您可能会发现 南安特 对你所谈论的内容非常有用。您可以定义的任务(构建、复制、移动、删除等)允许非常细粒度的文件查找,直至常规的完整文件夹。如果您还将 NAnt 合并到您的构建过程中,我想您会发现它能以多种方式提供帮助。

过去对我有用的另一种方法是添加共享资源(程序集、DLL 或项目)作为对每个管理、服务器和客户端项目的引用。然后打开每个项目中引用项的属性面板并将“复制本地”设置为 true。

现在,当您构建项目时,每个项目都会将其自己的程序集实例复制到其输出文件夹中。

这还应该导致以这种方式添加的共享组件被复制到安装包中的每个输出文件夹中。

一种完全不同的方法可能是将它们设置为网络共享上的符号链接。符号链接基本上是一个快捷方式,文件系统隐藏了它是快捷方式的事实,因此所有其他应用程序实际上都认为该文件已被复制(http://en.wikipedia.org/wiki/NTFS_symbolic_link).

这种方法的优点之一是,文件更改时会立即更新,而不仅仅是在构建项目时更新。因此,当您使用文本编辑器保存配置文件之一时,更新将立即应用。

以下 MSBuild 脚本部分可以构建您的 SLN 文件(您可以将其替换为 .csproj),并将报告已构建的所有项目(Dll、EXE)的列表。

 <MSBuild Projects="MySolution.sln" Targets="Clean; Rebuild" Properties="Configuration=$(BuildMode);">
    <Output TaskParameter="TargetOutputs"
                ItemName="AssembliesBuilt" />
    </MSBuild>

现在,这并不能真正解决您的问题,但它可以为您提供已构建的所有内容的列表。您还有 copylocal,因此您可能只需使用 AssembiesBuild 并从那里复制所有 DLL 和 .CONFIG 文件。

例子:

AssembliesBuild = c:\myproj\something1\build.dll

您可以转到 c:\myproj\something1\ 并简单地搜索所有 *.dll 和 *.config 文件并包含它们。如果安装了 MSBuild 或 powershell,您可以轻松地完成此操作。要从 MSBuild 输出 XCOPY 脚本,我认为您需要安装 MSBuild contrib projct。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top