独角兽 3 在未启用透明同步时将项目同步到磁盘



我有一个 Sitecore 7.2 解决方案,我已经将 Unicorn 3 安装

到其中。

我使用了提供的默认配置文件。在开发中,我在进行初始同步后启用了透明同步

<dataProviderConfiguration type="Unicorn.Data.DataProvider.DefaultUnicornDataProviderConfiguration, Unicorn" enableTransparentSync="true" /> 

我创建了一个 transofrm 文件,以便在将解决方案部署到非开发环境时,它将 enableTransparentSync 切换回 false。

在此解决方案中,有一些自定义模块,我正在使用由Benjamin Vangansewinkel创建的命令包安装程序(https://github.com/VGBenjamin/PackageInstaller)

当我运行命令行安装软件包时,它给了我一个错误,指示它无法将 yml 文件写入磁盘。

现在我已经检查了此环境中的Unicorn.config文件,并且可以确认enableTransparentSync设置为false。

我尝试安装的软件包正在尝试创建项目/sitecore/content/Applications/

Content Editor/Context Menues/Default/我可以看到,使用默认配置,/sitecore/content/Applications/中的所有内容都将同步。

在开发计算机上,已安装所有 sitecore 模块,并且/sitecore/content/Applications/Content Editor/Context Menues/Default/下的 yml 文件将序列化到磁盘。

这可能是我的误解,但我认为如果禁用了透明同步,那么当对 Sitecore 进行更改时,您必须转到独角兽控制面板并手动同步所有修改。那么,为什么在未启用透明同步时,我会收到有关无法将更改写入磁盘的错误。

现在另一种选择是从 default.config 中删除以下行

<include database="core" path="/sitecore/system/Field types"/>
<include name="Core Settings" database="core" path="/sitecore/system/Settings" />
<include name="Core Start Menu" database="core" path="/sitecore/content/Documents and settings/All users"/>
<include name="Core Applications" database="core" path="/sitecore/content/Applications"/>

但在我这样做之前,我想知道为什么独角兽似乎使用透明同步。

仅供参考:这是完整的错误堆栈

2016-03-22 15:38:15,996 [1] ERROR Sidewalk.SC.PackageInstaller.Client.Program [(null)] - System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.UnauthorizedAccessException: Access to the path 'D:WebsitesCIWebsiteUnicornDefault ConfigurationCore ApplicationsApplicationsContent EditorContext MenuesDefaultBulk Export.yml' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.InternalDelete(String path, Boolean checkHost)
   at Rainbow.Storage.SerializationFileSystemTree.WriteItem(IItemData item, String path)
   at Rainbow.Storage.SerializationFileSystemTree.Save(IItemData item)
   at Unicorn.Data.DataProvider.UnicornDataProvider.SaveItem(ItemDefinition itemDefinition, ItemChanges changes, CallContext context)
   at Unicorn.Data.DataProvider.UnicornSqlServerDataProvider.SaveItem(ItemDefinition itemDefinition, ItemChanges changes, CallContext context)
   at Sitecore.Data.DataProviders.DataProvider.SaveItem(ItemDefinition item, ItemChanges changes, CallContext context, DataProviderCollection providers)
   at Sitecore.Data.DataSource.SaveItem(ID itemID, ItemChanges changes)
   at Sitecore.Data.Engines.EngineCommand`2.Execute()
   at Sitecore.Data.Engines.DataEngine.SaveItem(Item item)
   at Sitecore.Data.Managers.ItemProvider.SaveItem(Item item)
   at Sitecore.Data.Items.ItemEditing.AcceptChanges(Boolean updateStatistics, Boolean silent)
   at Sitecore.Install.Items.ItemInstaller.VersionInstaller.InstallVersion(Item version)
   at Sitecore.Install.Items.ItemInstaller.VersionInstaller.PasteVersion(XmlNode versionXml, Item target, VersionInstallMode mode, IProcessingContext context, Boolean removeOtherVersions)
   at Sitecore.Install.Items.ItemInstaller.InstallEntry(PackageEntry entry)
   at Sitecore.Install.Items.ItemInstaller.Flush()
   at Sitecore.Install.Framework.SinkDispatcher.Flush()
   at Sitecore.Install.Utils.EntrySorter.Flush()
   at Sitecore.Install.Framework.EntryBuilder.Flush()
   at Sitecore.Install.Zip.PackageReader.Populate(ISink`1 sink)
   at Sitecore.Install.Installer.InstallPackage(String path, Boolean registerInstallation, ISource`1 source, IProcessingContext context)
   at Sitecore.Install.Installer.InstallPackage(String path, ISource`1 source, IProcessingContext context)
   at Sidewalk.SC.PackageInstaller.Service.SitecorePackageInstaller.InstallPackage(String path)
   --- End of inner exception stack trace ---
System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.UnauthorizedAccessException: Access to the path 'D:WebsitesCIWebsiteUnicornDefault ConfigurationCore ApplicationsApplicationsContent EditorContext MenuesDefaultBulk Export.yml' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.InternalDelete(String path, Boolean checkHost)
   at Rainbow.Storage.SerializationFileSystemTree.WriteItem(IItemData item, String path)
   at Rainbow.Storage.SerializationFileSystemTree.Save(IItemData item)
   at Unicorn.Data.DataProvider.UnicornDataProvider.SaveItem(ItemDefinition itemDefinition, ItemChanges changes, CallContext context)
   at Unicorn.Data.DataProvider.UnicornSqlServerDataProvider.SaveItem(ItemDefinition itemDefinition, ItemChanges changes, CallContext context)
   at Sitecore.Data.DataProviders.DataProvider.SaveItem(ItemDefinition item, ItemChanges changes, CallContext context, DataProviderCollection providers)
   at Sitecore.Data.DataSource.SaveItem(ID itemID, ItemChanges changes)
   at Sitecore.Data.Engines.EngineCommand`2.Execute()
   at Sitecore.Data.Engines.DataEngine.SaveItem(Item item)
   at Sitecore.Data.Managers.ItemProvider.SaveItem(Item item)
   at Sitecore.Data.Items.ItemEditing.AcceptChanges(Boolean updateStatistics, Boolean silent)
   at Sitecore.Install.Items.ItemInstaller.VersionInstaller.InstallVersion(Item version)
   at Sitecore.Install.Items.ItemInstaller.VersionInstaller.PasteVersion(XmlNode versionXml, Item target, VersionInstallMode mode, IProcessingContext context, Boolean removeOtherVersions)
   at Sitecore.Install.Items.ItemInstaller.InstallEntry(PackageEntry entry)
   at Sitecore.Install.Items.ItemInstaller.Flush()
   at Sitecore.Install.Framework.SinkDispatcher.Flush()
   at Sitecore.Install.Utils.EntrySorter.Flush()
   at Sitecore.Install.Framework.EntryBuilder.Flush()
   at Sitecore.Install.Zip.PackageReader.Populate(ISink`1 sink)
   at Sitecore.Install.Installer.InstallPackage(String path, Boolean registerInstallation, ISource`1 source, IProcessingContext context)
   at Sitecore.Install.Installer.InstallPackage(String path, ISource`1 source, IProcessingContext context)
   at Sidewalk.SC.PackageInstaller.Service.SitecorePackageInstaller.InstallPackage(String path)
   --- End of inner exception stack trace ---
   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at Sidewalk.SC.PackageInstaller.Client.ServiceReference.SitecorePackageInstaller.InstallPackage(String path) in C:ProjectsPackageInstallerSidewalk.SC.PackageInstaller.ClientWeb ReferencesServiceReferenceReference.cs:line 88
   at Sidewalk.SC.PackageInstaller.Client.Program.Main(String[] args) in C:ProjectsPackageInstallerSidewalk.SC.PackageInstaller.ClientProgram.cs:line 281

可以看到内部异常是尝试将项目保存到磁盘 at Rainbow.Storage.SerializationFileSystemTree.WriteItem(IItemData item, String path)

更新

只是为了让每个人都知道,这个问题与我的 CI 环境有关,我在部署过程中收到错误。

更新 2

我已经阅读了博客文章,http://kamsar.net/index.php/2015/10/Unicorn-Introducing-Transparent-Sync/,我显然仍在理解一些东西。

有以下文字:

注: 在启用配置之前,必须在关闭透明同步的情况下执行配置的初始序列化。否则,配置中的项目似乎会消失,因为透明同步会显示磁盘上的所有零项目!

打开透明同步

非常简单:将要添加透明同步的内容放入其中:

启用透明同步后,您只需更改磁盘上的项目,更新将立即显示在 Sitecore 中。

读到这里,我假设如果你可以打开透明同步,那么你可以再次关闭它。

查看自述文件 https://github.com/kamsar/Unicorn 我假设要在其他环境中同步,在执行部署后,您可以使用 powershell 向控制面板发出 http 查询。

如果无法关闭透明同步,那么在部署到 CI 环境时停止透明同步的最佳做法是什么? 并使用 Powershell 执行更新。

目前我只希望透明同步在开发环境中工作

我认为您误解了透明同步。

的作用是:它允许更新的 YML 立即反映在 Sitecore 中,而无需您执行新的同步。它通过偷偷摸摸地将数据提供给 Sitecore 来做到这一点。当您刚刚从 GIT 中提取或在分支之间切换时,这很有用 - 消除了必须同步(或忘记)的麻烦。

它不做的是禁用 Sitecore 更改的自动同步。这些内容一直被写入磁盘,用于 Unicorn 被告知要控制的内容树的任何区域。

所以事实上,几乎与你写的相反;"这可能是我的误解,但我认为如果禁用透明同步,那么当对 Sitecore 进行更改时,您必须转到独角兽控制面板并手动同步所有修改。那么,为什么在未启用透明同步时,我会收到有关无法将更改写入磁盘的错误。

参考: http://kamsar.net/index.php/2015/10/Unicorn-Introducing-Transparent-Sync/

最新更新