使用nuspec的Nuget Pack CSPROJ

标签 nuget nuget-package nuget-spec

我想创建一个仅包含nuspec文件中指定内容的nuget程序包,但仍从csproj获取版本。为了使用 token ,我必须像这样打包:

nuget pack MyProj.csproj

但是当我这样做时,它会添加一些依赖关系,并在我的nuget包中创建一个不需要的文件夹。我的nuspec文件是:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata>    
    <id>Test</id>
    <version>$version$</version>
    <title>Test</title>
    <authors>Test</authors>
    <owners>Test</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Test</description>
    <summary>Test</summary>
    <releaseNotes>Test</releaseNotes>
    <copyright>Test</copyright>  
  </metadata>
  <files>
    <file src="bin\Debug\*.dll" target="lib\net45" />
    <file src="bin\Debug\MyProj.Wpf.exe" target="lib\net45" />
    <file src="bin\Debug\MyProj.Wpf.exe.config" target="lib\net45" />
  </files>
</package>

当我运行pack命令时,该文件还会在target =“lib\net452”中添加MyProj.Wpf.exe。

我可以强制它不添加依赖项和这个额外的文件吗?还是只执行nuspec中指定的操作?

最佳答案

自从我发布这个问题已经有一段时间了。从那时起,我使用了对我有用的解决方案,因此我将在这里将其发布给需要它的任何人。

我创建了一个.csproj,用于修改.nuspec文件并根据.csproj的汇编文件设置其版本。为了减少手工工作,我创建了一个.bat文件,该文件使用参数调用此.exe,并完成了安装程序的创建。我使用Squirrel.Windows来创建安装程序。

我创建了一个NuspectVersionSetter.csproj来设置nuspec版本。有很多方法可以实现这一点,这里有一个简单的方法:

static void Main(string[] args)
{
    try
    {
        if (args.Length < 2)
        {
            throw new Exception("Args are not correct");
        }
        var assemblyFilePath = args[0];
        var nuspecFilePath = args[1];
        IsFileValid(assemblyFilePath, ".cs");
        IsFileValid(nuspecFilePath, ".nuspec");
        var version = GetAssemblyVersion(assemblyFilePath);
        if (string.IsNullOrEmpty(version))
        {
            throw new Exception("Unable to get version");
        }
        WriteNuspec(nuspecFilePath, version);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
    }
}

static void WriteNuspec(string path, string version)
{
    var lines = File.ReadAllLines(path);
    string versionLine = null;
    for(var i = 0; i < lines.Length; ++i)
    {
        var line = lines[i];
        if (line.Contains("<version>") && line.Contains("</version>"))
        {
            var init = line.IndexOf("<version>") + "<version>".Length;
            var end = line.IndexOf("</version>");
            line = line.Remove(init, end - init);
            lines[i] = line.Insert(init, version);
            break;
        }
    }
    File.WriteAllLines(path, lines);
}

static void IsFileValid(string file, string extension)
{
    if (!File.Exists(file))
    {
        throw new Exception("Invalid file path: " + file);
    }
    if (!file.EndsWith(extension))
    {
        throw new Exception("Invalid file extension: " + file);
    }
}

static string GetAssemblyVersion(string path)
{
    var lines = File.ReadAllLines(path);
    foreach(var line in lines)
    {
        if(line.Contains("AssemblyVersion") && !line.Contains(".*"))
        {
            var parts = line.Split('\"');
            if (parts.Length != 3)
            {
                break;
            }
            return parts[1];
        }
    }
    foreach (var line in lines)
    {
        if (line.Contains("AssemblyFileVersion") && !line.Contains(".*"))
        {
            var parts = line.Split('\"');
            if (parts.Length != 3)
            {
                break;
            }
            return parts[1];
        }
    }
    foreach (var line in lines)
    {
        if (line.Contains("AssemblyInformationalVersion") && !line.Contains(".*"))
        {
            var parts = line.Split('\"');
            if (parts.Length != 3)
            {
                break;
            }
            return parts[1];
        }
    }
    throw new Exception("Unable to get version");
}

如前所述,.bat文件还包含Squirrel.Windows安装程序的创建。

关于.bat的一些小发现:
  • NuspecVersionSetter是从
  • 上方的.csproj创建的.exe
  • 此示例假定您的NuspecVersionSetter.exe位于.csproj中的文件夹中,因此可能需要调整一些路径
  • 在此示例中,Squirrel.Windows版本较旧,您需要将其更改为

  • 我使用的.bat文件如下:
    NuspecVersionSetter ../Properties/AssemblyInfo.cs mynuspec.nuspec
    nuget pack
    @echo off
    setlocal EnableDelayedExpansion
    for /f "tokens=*" %%G in ('dir *.nupkg /b /a-d /od') do (
        SET newest=%%G
    )
    
    "../../packages/squirrel.windows.1.2.1/tools/Squirrel" --releasify !newest! -g installing.gif
    

    如果对此答案有任何疑问,请在评论中提问。

    关于使用nuspec的Nuget Pack CSPROJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590511/

    相关文章:

    .net - 如何为 xbuild 添加缺少的程序集引用? (单声道/Linux)

    silverlight - MVVM Light Nuget包中缺少SimpleIoc

    xamarin.forms - 无法在 Xamarin Forms 项目 (netstandard2.0) 上安装某些包

    twitter-bootstrap - Bootstrap Nuget 包

    c# - C#中如何调用基于XML-RPC规范的API?

    breeze - "Unable to satisfy package dependency constraints"与 Breeze.Server.WebAPI2

    带有不在 lib 子文件夹中的程序集的 NuGet 引用规范

    .net - 在nuget中定位多个框架的最简单方法?

    c# - 在 Visual Studio 中的多存储库中开发和调试项目