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。
我已经做了一个多星期了,但我仍然没有运气。
简而言之,这是我要实现的目标 -
我有一个 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。