Nuget 輸出資源文件

組件經常有一些文件/環境依賴,提升內聚,可以將文件(exe、dll等)放在到Nuget包內自動輸出、啓動相應的環境

通過csproj文件配置,Nuget包自動輸出到編譯目錄下。

如上圖,vcomp140d.dll是Nuget包內的文件。項目NugetContentFilesDemo引用NugetContentFiles包後,編譯時能在輸出目錄下自動生成vcomp140d.dll文件。

方案一 通過ContentFiles輸出

設置文件屬性爲生成內容、複製輸出到目錄 ,再補充PackageCopyToOutput屬性

1     <ItemGroup>
2         <Content Include="vcomp140d.dll">
3             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
4             <PackageCopyToOutput>true</PackageCopyToOutput>
5         </Content>
6     </ItemGroup>

屬性解讀:

  • CopyToOutputDirectory,在項目NugetContentFilesDemo通過項目方式引用時,能編譯輸出vcomp140d.dll文件
  • PackageCopyToOutput,在項目NugetContentFilesDemo通過Nuget方式引用時,能自動編譯輸出vcomp140d.dll文件

Content,默認是輸出到content;contentFiles下。

再看nuspec,有下面一行配置,會將contentFiles下的vcomp140d.dll文件複製到輸出目錄。

然後NugetContentFilesDemo引用此Nuget包,編譯下就能看到自動輸出的文件。

vcomp140d.dll文件是自動輸出了。但Nuget項目編譯時,會有警告:“dll文件,請移動到lib文件夾”

 這是啥意思呢?按官方NuGet 警告 NU5100 | Microsoft Learn,dll文件需要放在lib文件夾下,才符合Nuget包結構及規範。

有個屬性NoPackageAnalysis,

<NoPackageAnalysis>true</NoPackageAnalysis>

設置後可以跳過檢查、規避相應的警告。但這樣總有風險,Nuget包真有問題後面也不會有警告了。

另外,輸出到lib文件夾確實是合理的,現在content以及contentFiles倆處文件夾,都有vcomp140d.dll文件,導致Nuget包大了點。都是有追求的程序員,能解決咱們一定要找辦法

方案二 通過Lib文件夾輸出

使用Pack打包並通過PackagePath,添加文件到Nuget包指定位置

1     <<ItemGroup>
2         <None Include="vcomp140d.dll" Pack="True" PackagePath="lib\$(TargetFramework)\vcomp140d.dll" />
3     </ItemGroup>

我們看下Nuget包文件,位置是okay的

如果將它輸出來,複製到引用nuget包的項目輸出目錄下。csproj沒有一個簡單的屬性能配置。。。
在大佬毅仔的指導下解決了,感謝我們的MVPwalterlv。可以在Target="AfterBuild"編譯後,將文件複製出來:

1     <Target Name="AfterBuildCopy" AfterTargets="AfterBuild">
2         <ItemGroup>
3             <_AfterBuildCopyFile Include="$(OutputPath)**" />
4         </ItemGroup>
5         <Copy SourceFiles="@(_AfterBuildCopyFile)" DestinationFolder="$(OutputPath)" SkipUnchangedFiles="True" />
6     </Target>

能看到輸出目錄下的vcomp140d.dll文件:

target屬性以及build.targets文件可以做很多操作。安利下其它的target使用:在 MSBuild 編譯過程中操作文件和文件夾(檢查存在/創建文件夾/讀寫文件/移動文件/複製文件/刪除文件夾) - walterlv

 

參考列表:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章