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

标签 msbuild .net-core rhel csproj

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

我是一名大学生。我想在我的类(class)中使用 .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 之类的操作是行不通的。

最佳答案

最简单的方法是设置 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文件位于您的用户目录/您的项目所在的目录层次结构中,以将目标连接到所有项目(除非它们尚未包含具有此名称的文件)。只需用 <Project> 包围目标即可该文件的元素。

有一个GitHub issue on changing the default location .

关于msbuild - 防止 .NET Core 2.0 在 RHEL7 上将文件保留在/tmp 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45950644/

相关文章:

c# - NSubstitute ILogger .NET Core

C# 验证 JSON 输入

puppet - RHEL 服务无法使用 Puppet 启动

c# - 生成错误 - Roslyn MSB3883 : Unexpected exception: System. IO.FileNotFoundException for System.Security.Principal.Windows

msbuild - msbuild/t :Pack supported in full . 是网络框架吗?

asp.net-core - Visual Studio 2017 csproj 核心文件排除

gcc - 运行 rhel6 构建的可执行文件时在 rhel7 机器上导入错误

c# - 从同一源代码生成的两个 DLL 文件有什么区别

msbuild - SpecsFor.Mvc 构建失败

linux - 如何在 RHEL 中将 GCC 从 4.x.x 升级到 GCC 5.x.x?