Premake: Как предотвратить добавление элементов <Link> в файлы проекта VS2013?
Я храню все мои исходные файлы в отдельном месте, чтобы мой багажник был чистым и организованным. Я просто указываю на это местоположение "SourceCode" в моих файлах lua, но устанавливаю мое "местоположение" в совершенно отдельный каталог "builds". По большей части это создает именно тот тип поведения, который мне нужен, и кажется элегантным решением. Кроме...
Когда я запускаю premake для генерации файлов проекта, он создает элементы Link для каждого включаемого файла (элемента Compile). В результате при открытии файла решения создается посторонняя папка. Эта папка больше никогда не используется.
Ex выдержка из сгенерированного файла проекта:
<ItemGroup>
<Compile Include="..\..\SourceCode\FileUtilities\FileUtilities.cs">
<Link>SourceCode\FileUtilities\FileUtilities.cs</Link>
</Compile>
<Compile Include="..\..\SourceCode\FileUtilities\FileWriter.cs">
<Link>SourceCode\FileUtilities\FileWriter.cs</Link>
</Compile>
</ItemGroup>
При открытии решения в VS2013 создаются папки "bin" и "obj" (по мере необходимости). Но дополнительный каталог "SourceCode" (и его дочерние элементы) также создается, но никогда больше не используется. Есть ли флаг, который я могу использовать, чтобы просто сказать premake НЕ включать блоки Link в файлы проекта?
Я использую premake5.
Вот как настроена моя структура каталогов:
\trunk\builds
\trunk\SourceCode\<Contains separate folders for each projects source code>
\trunk\premake\solutions\<contains premake solution files>
\trunk\premake\projects\<contains premake project files>
\trunk\premake\configurations\<contains premake configuration files>
файл шаблона решения, 'solution-Template.lua':
solutionName = "Template"
solution(solutionName)
location("../../builds/" .. solutionName)
--Include a configuration file to define all your build settings
include "../configurations/configurations-Template.lua"
--List all the projects contained in your solution.
--Note: The first project will be the default StartUp project
include "../projects/project-Template.lua"
include "../projects/project-AnotherProject.lua"
файл шаблона проекта, 'project-Template.lua':
projectName = "Template"
buildLocation = projectName
if solutionName ~= nil then
buildLocation = solutionName .. "/" .. projectName
end
project(projectName)
location("../../builds/" .. buildLocation)
--kind is the output type of the project.
--https://github.com/premake/premake-core/wiki/kind
kind "SharedLib"
--language is the programming language the project is written in
--https://github.com/premake/premake-core/wiki/language
language "C#"
targetdir("../../builds/" .. buildLocation .. "/bin/%{cfg.buildcfg}")
--List all the files used in the project using relative paths
--The wild card "*" works (e.g. *.cs). "**" checks all child folders
files
{
"../../SourceCode/Template/File1.cs",
"../../SourceCode/Template/File2.cs",
"../../SourceCode/Template/Etc.cs"
}
--List all the libraries/references that your project uses, including
--other projects
links
{
"System",
"Template"
}
файл конфигурации шаблона, 'configurations-Template.lua':
configurations { "Debug", "Release" }
--Define the platform configuration names. These can be named anything.
--Visual Studio will default to the first value upon opening the solution.
--Note: Be careful, 'Win32' is a predefined name and will be replaced with 'x86' even if
--you set the architecture to "x64".
platforms { "Win64", "Win32" }
--Set all the filters needed to produce the desired build/platform configuration results.
--https://github.com/premake/premake-core/wiki/Configurations_And_Platforms
filter "configurations:Debug"
defines { "DEBUG" }
flags { "Symbols" }
filter "configurations:Release"
defines { "NDEBUG" }
optimize "On"
filter { "platforms:Win32" }
system "Windows"
architecture "x86"
filter { "platforms:Win64" }
system "Windows"
architecture "x64"
Затем я бы запустил следующую команду из командной строки в \trunk\premake:
premake5 --file=./solutions/solution-Template.lua vs2013
Это приводит к тому, что в моем каталоге \ trunk \ builds \ создается папка и папка для каждого проекта, создаваемого в нем. Это именно то, что я хочу (и держит мой багажник организованным и чистым). Однако после открытия файла решения в VS2013 автоматически создаются папки для моих каталогов SourceCode вместе с папками bin и obj, но они вообще ни для чего не используются. Насколько я могу судить, это связано с добавлением элементов Link в файлы проекта.
2 ответа
Обычно Visual Studio настаивает на том, чтобы вы хранили свои источники C# в каталоге вашего проекта. Хорошим тестом будет попытка создать тот же макет проекта вручную в Visual Studio; это должно создать то же самое <Link>
элементы. Если этого не произойдет, лучше всего было бы открыть билет с новым выпуском с кратким описанием того, как разметка Visual Studio отличается от того, что генерирует Premake.
Извините, позвольте мне отредактировать это для большей ясности: файлы по умолчанию, которые создает Visual Studio (т.е. когда вы выбираете File > New Project…
) всегда находятся в одном каталоге с файлом проекта или в подкаталоге этого расположения. Если вы попытаетесь добавить новый файл в проект, VS также всегда поместит его в папку под проектом. В этом случае нет <Link>
элемент необходим.
MyProject/MyProject.csproj
MyProject/src/Hello.cs <--- in or under project directory, no link needed
Вы пытаетесь поместить свои исходные файлы в каталог выше местоположения файла проекта.
MyProject/build/MyProject.csproj
MyProject/src/Hello.cs <--- not in or under project directory, needs link
Если вы переместите src/
Premake не будет добавлять папку под файлом проекта <Link>
элемент. И если вы попытаетесь создать тот же макет-- src/
находится за пределами каталога проекта - в Visual Studio вы обнаружите, что он добавляет <Link>
Сама стихия.
Я решил это, изменив vs2005_csproj.lua (и запустив premake5 embed, а затем восстановив premake). Я добавил условие "if _ACTION" в строке 180.
if external then
--Change by Kpick, this is not needed (at least for vs2013)
if _ACTION < "vs2013" then
_p(3,'<Link>%s</Link>', path.translate(link))
end
end
Я должен добавить, что я не проверял, нужен ли вообще элемент Link для какой-либо версии VS. Я просто знаю, что это не нужно для vs2013, и я не хотел изменять исходный код больше, чем должен был.