如何复制相对于解决方案根目录的 Nuget 内容文件



我在当前项目上创建了一个 DAL,它是持久性无知的,并且有一个需要直接引用的协定 dll,然后是我们的 IoC 容器要扫描的实现 dll,以解析与\实现合约 dll 中定义的接口和 POC 相关的 ORM 特定实现和映射。我的愿望是将实现 dll 复制到 [解决方案根]\lib 目录。我已经创建了一个包并将实现 dll 加载到内容文件夹中,在安装包时,它们最终位于 [project root]\lib 中。

我的问题是我怎样才能让 Nuget 将我的实现 dll 复制到 [解决方案根]\lib?

我找到了一种似乎可行的方法。

  1. 在 Nuget 包的内容文件夹中,将要扫描的 dll 放在临时文件夹中。
  2. 将每个解决方案仅执行一次的 Init.ps1 脚本添加到 Nuget 包 (http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package) 的工具文件夹中。在此脚本中,将文件复制到所需的目录[solution dir]lib
  3. 将 Install.ps1 文件添加到 tools 文件夹,该文件将为每个已安装的项目运行一次,这将删除临时文件夹

然后,我可以为我的容器注册创建另一个依赖于我的 dal 包的包,并使用类似的方法来设置 IoC 注册。所以我会有

Company.Dal
Company.Dal.Ninject
Company.Dal.StructureMap

然后,使用者将安装使用他们使用的相同容器的包,这将负责安装所需的 DLL 以[solution dir]lib和配置容器以使用这些 DLL。

优点

  1. 它将完成工作。

缺点

  1. 必须将dll复制到所有已安装的项目,然后删除它们
  2. Init.ps1 也会在每次打开解决方案时运行

编辑@MrMVCMan,我继续创建了一篇博客文章,记录了我在这里是如何做到这一点的:http://www.ryanvice.net/nuget/creating-a-nuget-package-that-will-install-files-relative-to-the-solution/

我创建了一个通用的 nuget 包,它解决了您的问题,但采用了不同的方法。它不是将包复制到 lib 文件夹中,而是在构建时将它们复制到构建输出文件夹。

您的 nuspec 文件可能如下所示:

<files>
    <file src="outputImplementation.dll" target="outputImplementation.dll" />
    <file src="libImplementation.Contract.dll" target="outputImplementation.Contract.dll" />
</files>

将此 nuget 包添加到 Project the Implementation.Contract 时.dll get 将添加为对项目的引用,但实现不会添加到项目中。

有关完整的示例,请阅读我的博客:http://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=6&mobile=0

最新更新