Skip to content

Commit

Permalink
Merge branch 'devel'
Browse files Browse the repository at this point in the history
  • Loading branch information
kekyo committed Oct 15, 2024
2 parents a14c0d6 + c47bebe commit 48dca99
Show file tree
Hide file tree
Showing 15 changed files with 342 additions and 75 deletions.
70 changes: 69 additions & 1 deletion README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ ILSpyで見れば、すべての情報も確認できるでしょう:
* また、埋め込む対象の情報をカスタマイズする事もできます。例えば、MSBuildで使われる変数の値を埋め込むことで、ビルド時の詳細な情報も埋め込むことが出来ます。
* バージョンの埋め込みは、完全にMSBuildに統合されます。つまり、NuGetパッケージをインストールするだけで、Visual Studio、Rider、Visual Studio CodeといったIDEや 、CIのビルドプロセスでそのままバージョン埋め込みを実現できます。
* RelaxVersionerには、環境に依存するコードは含まれていないので、ほぼすべての.NET環境で動作します。
* CLIインターフェイスも存在します。テキストドキュメントにバージョン番号を埋め込んだり、.NETとは異なるプロジェクトシステム(例えばNPMの`project.json``Makefile`など)に対しても、同じバージョン表記を適用できます。
* CLIインターフェイスも存在します。テキストドキュメントにバージョン番号を埋め込んだり、.NETとは異なるプロジェクトシステム(例えば`Makefile`など)に対しても、同じバージョン表記を適用できます。
* NPM (Node.js package manager) には専用のモードがあります。CLIを使用することで、簡単にNPMプロジェクトとバージョン操作の一元化を実現できます。

### 出力されるコードの例

Expand Down Expand Up @@ -220,6 +221,70 @@ ABC0123456789abc ... XYZ
例えば、GitHub ActionsのようなCI/CD環境で、NPMパッケージ生成にバージョンを適用したり、テキストのドキュメントにバージョンを埋め込んだりすることが出来ます。


----

## Node.jsプロジェクトで使う

CLIインターフェイスには、NPM (Node.js package manager) 向けの特別なオプションがあります。
`package.json` ファイルが存在するディレクトリに移動して、以下のようにCLIを実行します:

```bash
$ rv --npm .
RelaxVersioner [3.8.0]: Generated versions code: Language=NPM, Version=12.34.56
```

すると、 `package.json` 内の `version` キーの値が、正しいバージョン値に置き換わります。

この機能は、NPM標準の `npm version` コマンドと似ています。
バージョンの検索アルゴリズムはRelaxVersionerに準じるため、.NETプロジェクトと共通化を図りたい場合に便利です。

更に、 `--npmns` オプションを使用すると、パッケージが依存するパッケージバージョンも同時に変更することが出来ます。
例えば、複数のパッケージ群を管理していて、かつパッケージ同士に依存関係がある場合:

```json
{
"name": "webapi-interaction",
"version": "0.0.1", // <-- このパッケージのバージョン(更新前)
"dependencies": {
"@foobar/helpers": "^1.4.0", // <-- 依存関係にある管理パッケージのバージョン
"@foobar/common": "^1.7.2", // <-- 依存関係にある管理パッケージのバージョン
"dayjs": "^1.2.3"
}
}
```

依存関係にあるパッケージ名の名前空間 (`@foobar`) を指定してCLIを実行します:

```bash
$ rv --npmns @foobar .
RelaxVersioner [3.8.0]: Generated versions code: Language=NPM, Version=12.34.56
```

これにより、全てのバージョン番号が統一されます:

```json
{
"name": "webapi-interaction",
"version": "13.24.5", // <-- 自動的に更新される
"dependencies": {
"@foobar/helpers": "^13.24.5", // <-- 自動的に更新される(依存関係)
"@foobar/common": "^13.24.5", // <-- 自動的に更新される(依存関係)
"dayjs": "^1.2.3" // <-- 更新されない
}
}
```

* 依存関係のチェックは、 `dependencies`, `peerDependencies`, `devDependencies` キーに対して行います。
* 依存関係にあるパッケージを識別するため、パッケージの名前空間を統一してください。
実際には単純な前方一致で確認するため、識別可能な名前であればどのような名前でも問題ありません。
* 依存関係にあるパッケージのバージョンには、自動的に `^` が付きます。

この機能は、 [NPM workspaces](https://docs.npmjs.com/cli/v7/using-npm/workspaces) と一緒にCIプロセスで扱う事を想定しています。
その場合、参照するパッケージのバージョン番号は `*` とするなど、NPM workspacesの取扱いに準じて下さい。
各パッケージのバージョンを更新したら、ワークスペースルートディレクトリで `npm install` を行うことで、
`package-lock.json` に正しいバージョン番号が反映されます。


----

## ヒントや参考情報
Expand Down Expand Up @@ -480,6 +545,9 @@ nuspecファイルを使ってパッケージを生成する場合は、デフ

## 履歴

* 3.8.0:
* NPM `package.json` のバージョンを自動挿入する、NPMモードを追加。
* NuGetパッケージをビルドする時に、ビルドログにバージョン番号のゴミが出力されていたのを修正。
* 3.7.0:
* CLIでカスタムブラケット指定に対応しました。
* 3.6.0:
Expand Down
69 changes: 68 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ If you look in ILSpy, you will also see all the information:
* You can also customize the information to be embedded. For example, by embedding the value of variables used in MSBuild, you can also embed detailed information at build time.
* Version embedding is fully integrated into MSBuild. This means that you can simply install the NuGet package and embed versions directly in the build process of IDEs such as Visual Studio, Rider, Visual Studio Code or in the build process of CI.
* RelaxVersioner does not contain any environment-dependent code, so it works in almost any .NET environment.
* A CLI interface also exists. You can embed version numbers in text documents and apply the same version notation to different project systems than .NET (e.g. NPM's `project.json`, `Makefile` and etc.).
* A CLI interface also exists. You can embed version numbers in text documents and apply the same version notation to different project systems than .NET (e.g. `Makefile` and etc.).
* CLI has a dedicated NPM (Node.js package manager) mode, which allows you to easily centralize NPM project and version operations.

## Sample output code

Expand Down Expand Up @@ -218,6 +219,69 @@ With this CLI, you can use a combination of RelaxVersioner for different targets
For example, in a CI/CD environment like GitHub Actions, you can apply versions to NPM package generation or embed versions in your text documentation.


----

## Using with Node.js projects

The CLI interface has special options for NPM (Node.js package manager).
Change to the directory where the `package.json` file is located and run the CLI as follows:

```bash
$ rv --npm .
RelaxVersioner [3.8.0]: Generated versions code: Language=NPM, Version=12.34.56
```

The value of the `version` key in `package.json` will then be replaced with the correct version value.

* This function is similar to the standard NPM `npm version` command.
* The version search algorithm is based on RelaxVersioner, so it is useful if you want to share the same version with .NET projects.

Furthermore, if you use the `--npmns` option, you can also change the package versions that the package depends on at the same time.
For example, if you are managing multiple packages and there are dependencies between the packages:

```json
{
"name": "webapi-interaction",
"version": "0.0.1", // <-- The version of this package (before updating)
"dependencies": {
"@foobar/helpers": "^1.4.0", // <-- Version of the managed package that is a dependency
"@foobar/common": "^1.7.2", // <-- Version of the managed package that is a dependency
"dayjs": "^1.2.3"
}
}
```

Run the CLI specifying the namespace of the package name (`@foobar`) that is a dependency:

```bash
$ rv --npmns @foobar .
```

This will unify all the version numbers:

```json
{
"name": "webapi-interaction",
"version": "13.24.5", // <-- Automatically updated
"dependencies": {
"@foobar/helpers": "^13.24.5", // <-- automatically updated (dependency)
"@foobar/common": "^13.24.5", // <-- automatically updated (dependency)
"dayjs": "^1.2.3" // <-- not updated
}
}
```

* Dependency checks are performed on the `dependencies`, `peerDependencies` and `devDependencies` keys.
* Please use a consistent package namespace to identify dependent packages.
* In practice, this is a simple prefix match, so any name that can be identified is fine.
* If you are targeting multiple namespaces, specify them separated by commas.
* The version of a dependent package is automatically prefixed with `^`.

This function is intended to be used with [NPM workspaces](https://docs.npmjs.com/cli/v7/using-npm/workspaces) and inside the CI process.
In that case, please follow the NPM workspaces handling, such as using `*` as the version number of the referenced package.
After updating the version of each package, run `npm install` in the workspace root directory to update the correct version numbers in `package-lock.json`.


----

## Hints and Tips
Expand Down Expand Up @@ -462,6 +526,9 @@ When you are using a nuspec file to generate a NuGet package, there are addition

## History

* 3.8.0:
* Added NPM mode, which automatically inserts the version of NPM `package.json`.
* Fixed version number print garbage in the build log when building NuGet packages.
* 3.7.0:
* CLI now supports custom bracket specification.
* 3.6.0:
Expand Down
1 change: 1 addition & 0 deletions RelaxVersioner.Core.Tests/RelaxVersioner.Core.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<PackageReference Include="NUnit" Version="4.2.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
<PackageReference Include="Verify.NUnit" Version="26.3.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>

<ItemGroup>
Expand Down
15 changes: 12 additions & 3 deletions RelaxVersioner.Core/Logger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#nullable enable

using System;
using System.ComponentModel;
using System.IO;

namespace RelaxVersioner;
Expand All @@ -18,7 +19,9 @@ public enum LogImportance
{
Low = 1,
Normal = 2,
High =3
High = 3,
[EditorBrowsable(EditorBrowsableState.Never)]
Ignore = 100,
}

public abstract class Logger
Expand All @@ -28,6 +31,8 @@ public abstract class Logger
protected Logger(string header) =>
this.Header = header;

public abstract void SetImportance(LogImportance lowerImportance);

public abstract void Message(LogImportance importance, string message);

public virtual void Message(LogImportance importance, string format, params object?[] args) =>
Expand Down Expand Up @@ -55,11 +60,12 @@ public static Logger Create(string header, LogImportance lowerImportance, TextWr

internal sealed class TextWriterLogger : Logger
{
private readonly LogImportance lowerImportance;
private readonly TextWriter @out;
private readonly TextWriter warning;
private readonly TextWriter error;

private LogImportance lowerImportance;

public TextWriterLogger(string header, LogImportance lowerImportance, TextWriter @out, TextWriter warning, TextWriter error) :
base(header)
{
Expand All @@ -69,9 +75,12 @@ public TextWriterLogger(string header, LogImportance lowerImportance, TextWriter
this.error = error;
}

public override void SetImportance(LogImportance lowerImportance) =>
this.lowerImportance = lowerImportance;

public override void Message(LogImportance importance, string message)
{
if (importance >= lowerImportance)
if (importance >= this.lowerImportance)
{
@out.WriteLine(message);
}
Expand Down
38 changes: 9 additions & 29 deletions RelaxVersioner.Core/Processor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ public sealed class ProcessorContext
public string BracketStart;
public string BracketEnd;
public bool IsDryRun;
public bool IsQuietOnStandardOutput;
public string[] NpmPrefixes;
}

public sealed class Processor
Expand All @@ -59,21 +61,6 @@ public Processor(Logger logger)

public string[] Languages { get; }

private readonly struct TargetCommit
{
public readonly int StartDepth;
public readonly Commit Commit;

public TargetCommit(int startDepth, Commit commit)
{
this.StartDepth = startDepth;
this.Commit = commit;
}

public override string ToString() =>
$"StartDepth={this.StartDepth}, {this.Commit}";
}

private static async Task<Result> WriteVersionSourceFileAsync(
Logger logger,
WriteProviderBase writeProvider,
Expand Down Expand Up @@ -181,20 +168,13 @@ public async Task<Result> RunAsync(
using var repository = await Utilities.OpenRepositoryAsync(
logger, context.ProjectDirectory);

try
{
return await WriteVersionSourceFileAsync(
logger,
writeProvider,
context,
repository?.Head,
DateTimeOffset.Now,
ct);
}
finally
{
repository?.Dispose();
}
return await WriteVersionSourceFileAsync(
logger,
writeProvider,
context,
repository?.Head,
DateTimeOffset.Now,
ct);
}

public static void WriteSafeTransacted(
Expand Down
3 changes: 2 additions & 1 deletion RelaxVersioner.Core/RelaxVersioner.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@
<ItemGroup>
<PackageReference Include="GitReader" Version="1.8.0" />
<PackageReference Include="NamingFormatter" Version="2.4.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="All" />
<PackageReference Condition="'$(RV_BOOTSTRAP)' != 'True'"
Include="RelaxVersioner" Version="3.6.0" PrivateAssets="all" />
Include="RelaxVersioner" Version="3.7.0" PrivateAssets="all" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading

0 comments on commit 48dca99

Please sign in to comment.