.Net Framework Class 库 dll 在更新 Service Fabric 服务时总是发生变化
.Net Framework Class Library dll always changes when updating Service Fabric services
我在 Service Fabric 中有一个无状态的 .Net Core 服务 运行。在我的服务中,我引用了一个针对 .Net Framework 4.7.1 的 class 库。我通过 VSTS 部署应用程序,其中一个构建步骤更新了服务的应用程序版本并进行了更改。
https://docs.microsoft.com/en-us/vsts/build-release/tasks/utility/service-fabric-versioning
除了总是检测到 class 库的 dll 文件的变化外,一切正常。即使我没有更改代码库中的任何内容!这会导致构建步骤影响每个服务的版本。不仅仅是真正有更新的服务。
日志如下所示。 'MyClassLibrary.dll' 是一个 .Net Framework Class 库,我还没有接触过其中的代码。
2018-03-12T11:39:51.1989307Z Searching service 'MyServicePkg' for
changes...
2018-03-12T11:39:51.2247570Z Searching package 'Code' for changes...
2018-03-12T11:39:51.9878149Z The file 'MyClassLibrary.dll' has
changed.
2018-03-12T11:39:54.3850926Z Updated package 'MyServicePkg\Code'
from version '1.0.0' to '1.0.1'.
我知道检查代码包的变化是二进制比较。所以编译项目时二进制文件明显改变了。但是,我不知道为什么。我还有针对 .Net Standard 2.0 的代码库,它们不会导致此问题,因为只有在我实际接触代码时才会检测到更改。
我也知道可以手动忽略不应从应用程序包中更新的文件但是,这不是一个选项,因为部署链是自动化的。
所以我有以下问题:
- 是什么导致 .Net Framework class 库的二进制文件发生变化?
- 它与 .Net Standard class 库有何不同?
- 我该如何解决这个问题,以便我的服务仅在我进行实际更改时更新?从 .Net Framework 移植到 .Net Standard?
非常感谢对此事的一些见解。
默认情况下,即使您未进行任何更改,编译器也会创建不同的输出。使用 deterministic 编译器标志来确保具有相同输入的构建产生相同的输出。
因此,您需要在 MSBuild Arguments 中指定 /p:Deterministic=true
参数。
简单的方法是使用 Azure Service Fabric 应用程序 构建模板:创建一个新的构建定义> Select Azure Service Fabric 应用程序模板,然后你会发现,Visual Studio构建任务的MSBuild参数中有/p:Deterministic=true /p:PathMap=$(Agent.BuildDirectory)=C:\
。
我在 Service Fabric 中有一个无状态的 .Net Core 服务 运行。在我的服务中,我引用了一个针对 .Net Framework 4.7.1 的 class 库。我通过 VSTS 部署应用程序,其中一个构建步骤更新了服务的应用程序版本并进行了更改。 https://docs.microsoft.com/en-us/vsts/build-release/tasks/utility/service-fabric-versioning
除了总是检测到 class 库的 dll 文件的变化外,一切正常。即使我没有更改代码库中的任何内容!这会导致构建步骤影响每个服务的版本。不仅仅是真正有更新的服务。
日志如下所示。 'MyClassLibrary.dll' 是一个 .Net Framework Class 库,我还没有接触过其中的代码。
2018-03-12T11:39:51.1989307Z Searching service 'MyServicePkg' for
changes...
2018-03-12T11:39:51.2247570Z Searching package 'Code' for changes...
2018-03-12T11:39:51.9878149Z The file 'MyClassLibrary.dll' has
changed.
2018-03-12T11:39:54.3850926Z Updated package 'MyServicePkg\Code'
from version '1.0.0' to '1.0.1'.
我知道检查代码包的变化是二进制比较。所以编译项目时二进制文件明显改变了。但是,我不知道为什么。我还有针对 .Net Standard 2.0 的代码库,它们不会导致此问题,因为只有在我实际接触代码时才会检测到更改。
我也知道可以手动忽略不应从应用程序包中更新的文件
所以我有以下问题:
- 是什么导致 .Net Framework class 库的二进制文件发生变化?
- 它与 .Net Standard class 库有何不同?
- 我该如何解决这个问题,以便我的服务仅在我进行实际更改时更新?从 .Net Framework 移植到 .Net Standard?
非常感谢对此事的一些见解。
默认情况下,即使您未进行任何更改,编译器也会创建不同的输出。使用 deterministic 编译器标志来确保具有相同输入的构建产生相同的输出。
因此,您需要在 MSBuild Arguments 中指定 /p:Deterministic=true
参数。
简单的方法是使用 Azure Service Fabric 应用程序 构建模板:创建一个新的构建定义> Select Azure Service Fabric 应用程序模板,然后你会发现,Visual Studio构建任务的MSBuild参数中有/p:Deterministic=true /p:PathMap=$(Agent.BuildDirectory)=C:\
。