簡體   English   中英

如何設置NuGet包以將內容文件復制到輸出構建目錄?

[英]How to setup a NuGet package to copy content files to output build directory?

注意:由於該問題的范圍太廣, 因此對該問題 (現已結束)進行了跟進,並且該問題的第一部分有關.dll的問題已解決,這是一個單獨的問題。

我正在開發一個名為ComputeSharp.NET Standard 2.0項目 ,我想將其發布為NuGet程序包,但我不知道如何讓程序包使用以下命令將內容文件復制到項目的輸出生成目錄中:它。 一些信息:

  • 該項目僅針對.NET Standard 2.0
  • 該項目在同一解決方案中使用2個引用的項目,每個項目都使用其他一些NuGet軟件包。 是我當前解決方案的屏幕。
  • 我的.nuspec位於主項目ComputeSharp的文件夾中,並具有以下結構:
<?xml version="1.0"?>
<package >
  <metadata>
    <id>ComputeSharp</id>
    ...
    <dependencies>
      <dependency id="SharpDX.Direct3D12" version="4.2.1-beta0-gab36f12303" />
      ...
    </dependencies>
    <contentFiles>
      <files include="..\ComputeSharp.Shaders\Renderer\Templates\*.mustache" buildAction="Content" copyToOutput="true" />
    </contentFiles>
  </metadata>
</package>
  • 為了創建NuGet包,我首先在Release模式下構建ComputeSharp ,然后在該項目的文件夾中打開一個cmd,然后運行:
nuget pack ComputeSharp.csproj -Prop Configuration=Release -IncludeReferencedProjects
  • 生成的NuGet包在檢查時看起來像這樣(看起來非常好,因為我可以看到包中正確的文件夾結構中“目錄”目錄下的.mustache文件):
ComputeSharp.x.x.x.nupkg
├───rels
│   └───...
├───content
│   └───Renderer
│       └───Templates
│           └───ShaderTemplate.mustache
├───lib
│   └───netstandard2.0
│       ├───ComputeSharp.dll
│       ├───ComputeSharp.Graphics.dll
│       └───ComputeSharp.Shaders.dll
├───package
│   └───...
├───[Content_Types].xml
└───ComputeSharp.nuspec

問題 :一旦我創建了一個測試項目並安裝了NuGet軟件包,就可以很好地構建它,但是整個Renderer\\Templates\\ShaderTemplate.mustache樹都沒有復制到構建目錄中,因此我的lib無法加載該文件(因為它是相對於lib程序集的路徑加載的)。

我已經閱讀了無數SO問題以及文檔,並在這里嘗試了很多組合(例如,設置ContentType="None"而不是"Content" ,但結果始終相同: .mustache文件存在於程序包,但不會使用該程序包復制到項目的構建目錄中。構建項目時,我還需要做一些其他事情來使NuGet程序包在輸出目錄中重新創建該樹+文件嗎?

謝謝您的幫助!

我建議通過生成操作“嵌入的資源”將所需的文件嵌入到程序集中。 這樣,您不必依靠Nuget來安裝它們。 相反,在首次使用時,您可以從程序集中讀取它們並將它們復制到文件系統中或直接使用它們。 這是從程序集中讀取嵌入式文件並將其復制到文件系統中的方法:

private void CopyEmbeddedResourceToFile(Assembly assembly, string resourceName, string filePath)
{
        var key = GetResourceKey(assembly, resourceName);
        using (Stream stream = assembly.GetManifestResourceStream(key))
        using (var file = new FileStream(filePath, FileMode.Create))
        {
            if (stream == null)
                throw new ArgumentException($"Resource name '{resourceName}' not found!");
            stream.CopyTo(file);
        }
}

您要使用contentFiles文件夾而不是content 請參閱此博客NuGet ContentFiles Demystified

您還可以閱讀使用PackageReference啟用對“內容”文件夾的支持,以解釋為何content文件夾不能與PackageReference

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM