【问题标题】:Nuget pack csproj using nuspec使用 nuspec 的 Nuget 包 csproj
【发布时间】:2015-10-13 22:40:14
【问题描述】:

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

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 中指定的事情?

【问题讨论】:

    标签: nuget nuget-package nuget-spec


    【解决方案1】:

    自从我发布这个问题以来已经有一段时间了。从那以后,我使用了一个对我有用的解决方案,所以我将把它贴在这里给任何需要它的人。

    我创建了一个 .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
    

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

    【讨论】:

      猜你喜欢
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 2021-05-11
      • 1970-01-01
      • 2015-08-17
      • 2017-06-14
      相关资源
      最近更新 更多