如何找到用于构建项目引用的项目的NuGet包的程序集文件?

时间:2017-10-09 20:03:35

标签: c# .net-standard .net-standard-2.0

我的方案是我有一个代码生成工具,它使用某些类库程序集作为输入。在过去,我有一个本地"包" NuGet将引用的包复制到的目录,我可以使用它们来查找程序集并使用它们作为输入运行代码生成器(或者我可以查看我的类库的输出目录,因为构建.Net Framework类库会复制它引用到输出目录的所有汇编文件。)

现在,切换到仅针对.Net Framework开发的新.csproj和.Net Standard,NuGet将软件包放在机器上的位置非常不透明的地方,并且类库的构建不再应对依赖于程序库的输出文件夹的汇编文件。

基本结构: SharedClassLibraryA

  • 存储在内部NuGet源中的包
  • 目标netstandard2.0

SharedClassLibraryB

  • 存储在内部NuGet源中的包
  • 取决于A
  • 目标netstandard2.0

SharedClassLibraryC

  • 我的部分解决方案
  • 具有对SharedClassLibraryA和SharedClassLibraryB
  • 的PackageReference
  • 目标netstandard2.0; net47

TestProject

  • 我的部分解决方案
  • 具有对SharedClassLibraryA和SharedClassLibraryB
  • 的PackageReference
  • 具有SharedClassLibraryC的ProjectReference
  • 目标netstandard2.0; net47
  • 代码生成器在构建之前运行,并将汇编文件作为命令行选项,以便使用反射和生成代码。 编辑:然后在编译步骤中编译生成的代码。

我遇到的问题是构建非.Net Framework目标并不会将依赖项所依赖的程序集文件复制到输出文件夹,因此我无法指向SharedClassLibraryC&#39 ; s输出文件夹,找到我的代码生成器作为输入的SharedClassLibraryA和SharedClassLibraryB程序集文件。

此外,NuGet包没有扩展到我的代码本地的文件夹中,所以我也不能在那里浏览以获取程序集文件。 (这需要知道包的文件夹结构的版本号和其他细节。)

构建.Net Framework目标将SharedClassLibraryA和SharedClassLibraryB的程序集文件复制到SharedClassLibraryC的输出目录,以便适用于该目标。 (不过,我想在某个时候取出.Net Framework目标。)

我尝试过添加一个BeforeTargets =" BeforeBuild"定位到在SharedClassLibraryC上运行dotnet发布的TestProject,让它将其依赖项的所有程序集文件复制到代码生成器可以指向的文件夹中;但是,您无法告诉它不要构建您正在运行dotnet发布的项目,因此该解决方案的构建版本将构建SharedClassLibraryC 4次(每次构建一次,用于为netstandard2.0和net47构建SharedClassLibraryC,并且每次构建一次) dotnet发布在为netstandard2.0和net47建立TestProject时运行。

编辑: https://stackoverflow.com/a/43841481/8748148处的解决方案将NuGet包DLL文件复制到输出目录(在我的情况下为bin\Debug\netstandard2.0),这解决了我的直接问题:

<PropertyGroup>
  <CopyLocalLockFileAssemblies>true</CopyLocalL‌​ockFileAssemblies>
</‌​PropertyGroup>

我会调查DependencyContext API;我怀疑这个代码生成器在命令行上使用了汇编文件路径来缩小它必须加载的内容并查找其属性,但是只查看整个依赖关系树可能要简单得多。

0 个答案:

没有答案