出于某种原因,我们有一个脚本可以创建批处理文件,以将我们编译的程序集、配置文件和各种其他文件 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.config
- 异常处理程序.dll
- 实用程序.dll
- 客户
- 客户端.exe
- 客户端.exe.config
- 异常处理程序.dll
- 实用程序.dll
- 服务器
- 服务器.exe
- 服务器.exe.config
- 异常处理程序.dll
由于引用的程序集都是相同的,我得到的是:
- 行政
- 管理员程序
- 管理员.exe.config
- 异常处理程序.dll
- 实用程序.dll
- 客户
- 客户端.exe
- 客户端.exe.config
- 服务器
- 服务器.exe
- 服务器.exe.config
当客户端或服务器找不到它所期望的两个 DLL 之一时,这会导致 FileNotFoundException。
我是否缺少设置属性以使其始终复制输出,即使它在另一个项目的输出中的其他地方重复?
再次编辑:所有引用的 DLL 都设置为“复制本地”,并且一直如此。我找到了一篇关于使用 NAnt 和 XSLT 获取文件列表的不错的文章,因此正如 neouser99 建议的那样,这也可能是一个可能的解决方案。
接受的解决方案:我几乎回到了我开始的地方。所有 .exe 和 .dll 输出都放在安装项目中的“bin”目录中,松散地打包。其他每个应用程序文件夹包含该目录中可执行文件的快捷方式。
现在的不同之处在于,我将向安装程序添加一个自定义操作以使用反射,枚举每个可执行输出的依赖项,并将 .exe 和 .dll 文件复制到单独的目录中。有点痛苦,因为我只是假设有一种方法可以通过一些设置库以编程方式检测将包含哪些文件。