組件經常有一些文件/環境依賴,提升內聚,可以將文件(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
參考列表: