Nuget 库 .exe 没有出现在主项目中

Nuget Library .exe's are not Appearing In Main Project

我已经做了一个多星期了,但我仍然没有运气。

简而言之,这是我要实现的目标 -

我有一个 Nuget 库,其中包含两个 .exe 文件, 库使用。问题是,当库被拉入主项目时,exes 要么没有正确地放在输出文件夹中,要么它们的路径变成了主项目路径而不是 nuget/lib 路径。

图书馆

这是.csproj

  <ItemGroup>
      <Content Include="Drivers/**">
          <Pack>true</Pack>
          <PackagePath>lib\net5.0\Drivers\</PackagePath>
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
          <CopyToPublishDirectory>Always</CopyToPublishDirectory>
          <PackageCopyToOutput>Always</PackageCopyToOutput>
      </Content>
  </ItemGroup>

我如何在库代码中使用 exe -

var path = $"{AppDomain.CurrentDomain.BaseDirectory}Drivers";

这成功打包了我的项目,并允许我在 运行 对我们的打包管道进行单元测试时使用 exe。下载到新项目后,它会创建一个 nuget 目录,路径为

{USER}\.nuget\packages\drivers.library.0.X

在该目录中有三个文件夹

--content (contains testhost stuff)
--contentFiles (contains testhost stuff)
--lib
   \ net5.0
         \ Drivers
             \ exe1 and exe2  

主要项目

所以导入库后

 <PackageReference Include="Drivers.Framework" Version="1.0.8" />

我希望根据库的 .csproj 文件中的设置将“驱动程序”文件夹内置到主项目的 OutputDirectory 中。

我还希望在库中使用 AppDomain.CurrentDomain.BaseDirectory 将默认为 .dll 在 .nuget 目录中的位置。

然而,显然不是这样。

就尝试获取 .dll 位置而言,我已经尝试过 -

        "1" + Assembly.GetExecutingAssembly().Location; 
        "2" + Assembly.GetExecutingAssembly().CodeBase; 
        "3" + AppDomain.CurrentDomain.BaseDirectory;
        "4" + AppDomain.CurrentDomain.DynamicDirectory;
        "5" + AppDomain.CurrentDomain.FriendlyName;
        "6" + AppDomain.CurrentDomain.RelativeSearchPath;

但这都指向主项目所在的位置,而不是库。

至于将 Drivers 文件夹从 .nuget 目录获取到主项目的输出文件夹。我在 csproj 中尝试了一些递归,但我只能获取依赖项 .dll 而不是 exe。我也看到有人使用 powershell,但我想尽可能避免使用它。

如果有人知道如何将 nuget/lib/Drivers 文件夹构建到主项目的输出文件夹中,我将永远感激不已。

谢谢大家。

所以我想出了我哪里出错了 -

在库的 csproj 文件中,它应该简单地读取 -

  <ItemGroup>
      <Content Include="Drivers/**">
          <CopyToPublishDirectory>Always</CopyToPublishDirectory>
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
  </ItemGroup>

注意我把线去掉了

<PackagePath>lib\net5.0\Drivers\</PackagePath>

阻止它构建到本地 .nuget/packages/this.library 路径的 content/contentFiles 文件夹。

删除该行后,“Drivers”文件夹和该文件夹中的 exe 将按预期内置到主项目中。

从那里,我将其添加到主项目的 csproj。

<Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
    <Copy SourceFiles="%(Content.Identity)"
          DestinationFiles="$(OutputPath)\%(Content.Link)"
          SkipUnchangedFiles="true"
          OverwriteReadOnlyFiles="true" />
</Target>

这会将“链接”文件(在本例中为 Drivers 文件夹)复制到主项目的 OutputFolder。