【问题标题】:Prevent .NET Core 2.0 from leaving files in /tmp on RHEL7防止 .NET Core 2.0 将文件留在 RHEL7 上的 /tmp 中
【发布时间】:2017-08-30 01:45:45
【问题描述】:

编辑:Martin 在下方提供了一个缺陷链接,该缺陷现已修复并发布。

我是一名大学生。我想在我的课程作业中使用 .NET Core。为此,我的代码需要在部门 Linux 集群上编译和运行,因为这是我的导师测试我提交的内容。

我的系统管理员在试用的基础上为我安装了最近发布的 .NET Core 2.0 RHEL 包。我创建、构建并运行了sample CLI projects Microsoft provides,它们工作正常。但是我的系统管理员很不高兴,因为dotnet 在(全局)/tmp 中创建了至少一个文件,在我注销后该文件仍然存在。

-rw------- myuser mygroup /tmp/.NETCoreApp,Version=v2.0.AssemblyAttributes.cs

原则上,他宁愿dotnet 不在 /tmp 中创建任何在处理完成时不会清理的文件。不仅如此,当他尝试自己构建微软的样本时,它失败了; dotnet 试图访问上面的文件,他的用户没有读取权限!

理想情况下,dotnet 不会创建任何生命周期与其正在构建的项目不同的文件。为此,任何此类文件都可以存在于项目目录中——可能在 bin 子目录下,以便clean 将清除它们。有没有办法让dotnet 在那里写这些文件?不然能不能少用临时文件名,避免我们遇到的权限冲突?

无论解决方案是什么,它都必须是全系统的,并且不能依赖于用户的良好行为。因此,要求用户设置 $TMPDIR 之类的操作将不起作用。

【问题讨论】:

    标签: msbuild .net-core rhel csproj


    【解决方案1】:

    最简单的方法是将 TMPDIR 环境变量设置为不同的位置,因为 MSBuild 使用它来构造路径。

    让 msbuild 使用本地路径的另一种方法是在 csproj 文件中添加这样的目标:

    <Target Name="SetTFMAssemblyAttributesPath"
          BeforeTargets="GenerateTargetFrameworkMonikerAttribute">
      <PropertyGroup>
        <TargetFrameworkMonikerAssemblyAttributesPath>$(IntermediateOutputPath)$(TargetFrameworkMoniker).AssemblyAttributes$(DefaultLanguageSourceExtension)</TargetFrameworkMonikerAssemblyAttributesPath>
      </PropertyGroup>
      <ItemGroup>
        <!-- GenerateTargetFrameworkMonikerAttribute doesn't add to @(FileWrites) for the global path -->
        <FileWrites Include="$(TargetFrameworkMonikerAssemblyAttributesPath)" />
      </ItemGroup>
    </Target>
    

    这会将其放入IntermediateOutputPath,即obj/{Debug/Release}/{TargetFramework}/。添加的FileWrites 项允许在dotnet clean 上对其进行清理,这对全局位置不进行,以避免清理期间的竞争条件。

    您可以在您的用户目录/在您的项目所在的目录层次结构中创建一个Directory.Build.targets 文件,以将目标连接到所有项目(除非它们尚未包含具有此名称的文件)。只需将此文件的目标用&lt;Project&gt; 元素包围即可。

    有一个GitHub issue on changing the default location

    【讨论】:

    • 谢谢,很高兴知道这一点——尽管我确实希望能找到一个不依赖于用户纪律的解决方案。
    • 是的,这是永远项目的解决方法。我在相关的 GitHub 问题上链接到它(我会将它添加到答案中)。
    • 添加了Directory.Build.targets 的建议,以将此逻辑添加到您从事的所有项目中。如果答案对您有用,请考虑接受答案。
    • 这是 .NET 的用户设置,位于用户主目录下的文件中?这本身听起来很明智,但它是否解决了像我们这样的多用户机构系统的问题?我的管理员需要它作为所有当前和未来用户的系统默认值。我不认为这样的文件可以达到这个目的。管理员很难强迫它在那里存在,用户删除也太容易——而且大多数用户不需要它,因为不是每个人都使用 .NET。一个专门用于此的 Linux 环境变量(不是 $TMPDIR)可以工作,或者全局 /etc 下的可选配置文件。
    • 知道了。谢谢你的努力,马丁。如果您认为这会受到欢迎,我会将我建议的解决方案添加到 GH 问题。
    猜你喜欢
    • 1970-01-01
    • 2020-06-11
    • 2018-11-08
    • 2018-11-12
    • 2018-01-22
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多