防止 .NET Core 2.0 在 RHEL7 上将文件留在 /tmp 中

Noa*_*oah 3 msbuild rhel csproj .net-core

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

我的系统管理员在试用的基础上为我安装了最近发布的 .NET Core 2.0 RHEL 包。我创建、构建并运行了Microsoft 提供示例 CLI 项目,并且它们运行良好。但是我的系统管理员很不高兴,因为dotnet在(全局)/tmp 中创建了至少一个文件,在我注销后它仍然存在。

-rw------- myuser mygroup /tmp/.NETCoreApp,Version=v2.0.AssemblyAttributes.cs
Run Code Online (Sandbox Code Playgroud)

原则上,他不希望dotnet/tmp中创建任何在其进程完成后不会清理的文件。更重要的是,当他试图自己构建微软的样本时,它失败了;dotnet试图访问上述文件,他的用户没有读取权限!

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

无论解决方案是什么,它都必须是全系统的,不能依赖于用户的良好行为。所以像要求用户设置$TMPDIR这样的事情是行不通的。

Mar*_*ich 5

最简单的方法是将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>
Run Code Online (Sandbox Code Playgroud)

这会将其放入IntermediateOutputPathwhich is 中obj/{Debug/Release}/{TargetFramework}/。添加的FileWrites项目允许它在 上进行清理dotnet clean,这不是针对全局位置进行的,以避免在清理过程中出现竞争条件。

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

更改默认位置存在GitHub 问题